DriveHQ Start Menu
Cloud Drive Mapping
Folder Sync
Cloud Backup
True Drop Box
FTP/SFTP Hosting
Group Account
DriveHQ Start Menu
Online File Server
My Storage
|
Manage Shares
|
Publishes
|
Drop Boxes
|
Group Account
WebDAV Drive Mapping
Cloud Drive Home
|
WebDAV Guide
|
Drive Mapping Tool
|
Drive Mapping URL
Complete Data Backup
Backup Guide
|
Online Backup Tool
|
Cloud-to-Cloud Backup
FTP, Email & Web Service
FTP Home
|
FTP Hosting FAQ
|
Email Hosting
|
EmailManager
|
Web Hosting
Help & Resources
About
|
Enterprise Service
|
Partnership
|
Comparisons
|
Support
Quick Links
Security and Privacy
Download Software
Service Manual
Use Cases
Group Account
Online Help
Blog
Contact
Cloud Surveillance
Sign Up
Login
Features
Business Features
Online File Server
FTP Hosting
Cloud Drive Mapping
Cloud File Backup
Email Backup & Hosting
Cloud File Sharing
Folder Synchronization
Group Management
True Drop Box
Full-text Search
AD Integration/SSO
Mobile Access
IP Camera & DVR Solution
More...
Personal Features
Personal Cloud Drive
Backup All Devices
Mobile APPs
Personal Web Hosting
Sub-Account (for Kids)
Home/PC/Kids Monitoring
More...
Software
DriveHQ Drive Mapping Tool
DriveHQ FileManager
DriveHQ Online Backup
DriveHQ Mobile Apps
Pricing
Business Plans & Pricing
Personal Plans & Pricing
Price Comparison with Others
Feature Comparison with Others
Install Mobile App
Sign up
Creating account...
Invalid character in username! Only 0-9, a-z, A-Z, _, -, . allowed.
Username is required!
Invalid email address!
E-mail is required!
Password is required!
Password is invalid!
Password and confirmation do not match.
Confirm password is required!
I accept
Membership Agreement
Please read the Membership Agreement and check "I accept"!
Free Quick Sign-up
Sign-up Page
Log in
Signing in...
Username or e-mail address is required!
Password is required!
Keep me logged in
Quick Login
Forgot Password
Up
Upload
Download
Share
Publish
New Folder
New File
Copy
Cut
Delete
Paste
Rate
Upgrade
Rotate
Effect
Edit
Slide
History
/* Copyright 2005-2007 Adobe Systems Incorporated Use, modification and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). See http://opensource.adobe.com/gil for most recent version including documentation. */ /*************************************************************************************************/ #ifndef GIL_METAFUNCTIONS_HPP #define GIL_METAFUNCTIONS_HPP //////////////////////////////////////////////////////////////////////////////////////// /// \file /// \brief metafunctions that construct types or return type properties /// \author Lubomir Bourdev and Hailin Jin \n /// Adobe Systems Incorporated /// /// \date 2005-2007 \n Last updated on February 6, 2007 /// //////////////////////////////////////////////////////////////////////////////////////// #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "gil_config.hpp" #include "gil_concept.hpp" #include "channel.hpp" namespace boost { namespace gil { // forward declarations template
struct pixel; template
struct packed_pixel; template
struct planar_pixel_reference; template
struct planar_pixel_iterator; template
class memory_based_step_iterator; template
class memory_based_2d_locator; template
class image_view; template
class image; template
struct channel_type; template
struct color_space_type; template
struct channel_mapping_type; template
struct is_iterator_adaptor; template
struct iterator_adaptor_get_base; template
struct bit_aligned_pixel_reference; ////////////////////////////////////////////////// /// /// TYPE ANALYSIS METAFUNCTIONS /// Predicate metafunctions determining properties of GIL types /// ////////////////////////////////////////////////// /// \defgroup GILIsBasic xxx_is_basic /// \ingroup TypeAnalysis /// \brief Determines if GIL constructs are basic. /// Basic constructs are the ones that can be generated with the type /// factory methods pixel_reference_type, iterator_type, locator_type, view_type and image_type /// They can be mutable/immutable, planar/interleaved, step/nonstep. They must use GIL-provided models. /// \brief Determines if a given pixel reference is basic /// Basic references must use gil::pixel& (if interleaved), gil::planar_pixel_reference (if planar). They must use the standard constness rules. /// \ingroup GILIsBasic template
struct pixel_reference_is_basic : public mpl::false_ {}; template
struct pixel_reference_is_basic< pixel
&> : public mpl::true_ {}; template
struct pixel_reference_is_basic
&> : public mpl::true_ {}; template
struct pixel_reference_is_basic
> : public mpl::true_ {}; template
struct pixel_reference_is_basic
> : public mpl::true_ {}; /// \brief Determines if a given pixel iterator is basic /// Basic iterators must use gil::pixel (if interleaved), gil::planar_pixel_iterator (if planar) and gil::memory_based_step_iterator (if step). They must use the standard constness rules. /// \ingroup GILIsBasic template
struct iterator_is_basic : public mpl::false_ {}; template
// mutable interleaved struct iterator_is_basic< pixel
* > : public mpl::true_ {}; template
// immutable interleaved struct iterator_is_basic
* > : public mpl::true_ {}; template
// mutable planar struct iterator_is_basic
> : public mpl::true_ {}; template
// immutable planar struct iterator_is_basic
> : public mpl::true_ {}; template
// mutable interleaved step struct iterator_is_basic
*> > : public mpl::true_ {}; template
// immutable interleaved step struct iterator_is_basic
*> > : public mpl::true_ {}; template
// mutable planar step struct iterator_is_basic
> > : public mpl::true_ {}; template
// immutable planar step struct iterator_is_basic
> > : public mpl::true_ {}; /// \ingroup GILIsBasic /// \brief Determines if a given locator is basic. A basic locator is memory-based and has basic x_iterator and y_iterator template
struct locator_is_basic : public mpl::false_ {}; template
struct locator_is_basic
> > : public iterator_is_basic
{}; /// \ingroup GILIsBasic /// \brief Basic views must be over basic locators template
struct view_is_basic : public mpl::false_ {}; template
struct view_is_basic
> : public locator_is_basic
{}; /// \ingroup GILIsBasic /// \brief Basic images must use basic views and std::allocator of char template
struct image_is_basic : public mpl::false_ {}; template
struct image_is_basic
> : public mpl::true_ {}; /// \defgroup GILIsStep xxx_is_step /// \ingroup TypeAnalysis /// \brief Determines if the given iterator/locator/view has a step that could be set dynamically template
struct iterator_is_step; namespace detail { template
struct iterator_is_step_impl; // iterator that has the same type as its dynamic_x_step_type must be a step iterator template
struct iterator_is_step_impl
: public mpl::true_{}; // base iterator can never be a step iterator template
struct iterator_is_step_impl
: public mpl::false_{}; // for an iterator adaptor, see if its base is step template
struct iterator_is_step_impl
: public iterator_is_step
::type>{}; } /// \ingroup GILIsStep /// \brief Determines if the given iterator has a step that could be set dynamically template
struct iterator_is_step : public detail::iterator_is_step_impl
::type::value, is_same
::type>::value >{}; /// \ingroup GILIsStep /// \brief Determines if the given locator has a horizontal step that could be set dynamically template
struct locator_is_step_in_x : public iterator_is_step
{}; /// \ingroup GILIsStep /// \brief Determines if the given locator has a vertical step that could be set dynamically template
struct locator_is_step_in_y : public iterator_is_step
{}; /// \ingroup GILIsStep /// \brief Determines if the given view has a horizontal step that could be set dynamically template
struct view_is_step_in_x : public locator_is_step_in_x
{}; /// \ingroup GILIsStep /// \brief Determines if the given view has a vertical step that could be set dynamically template
struct view_is_step_in_y : public locator_is_step_in_y
{}; /// \brief Determines whether the given pixel reference is a proxy class or a native C++ reference /// \ingroup TypeAnalysis template
struct pixel_reference_is_proxy : public mpl::not_
::type, typename remove_const_and_reference
::type::value_type> > {}; /// \brief Given a model of a pixel, determines whether the model represents a pixel reference (as opposed to pixel value) /// \ingroup TypeAnalysis template
struct pixel_is_reference : public mpl::or_
, pixel_reference_is_proxy
> {}; /// \defgroup GILIsMutable xxx_is_mutable /// \ingroup TypeAnalysis /// \brief Determines if the given pixel reference/iterator/locator/view is mutable (i.e. its pixels can be changed) /// \ingroup GILIsMutable /// \brief Determines if the given pixel reference is mutable (i.e. its channels can be changed) /// /// Note that built-in C++ references obey the const qualifier but reference proxy classes do not. template
struct pixel_reference_is_mutable : public mpl::bool_
::type::is_mutable> {}; template
struct pixel_reference_is_mutable
: public mpl::and_
, pixel_reference_is_mutable
> {}; /// \ingroup GILIsMutable /// \brief Determines if the given locator is mutable (i.e. its pixels can be changed) template
struct locator_is_mutable : public iterator_is_mutable
{}; /// \ingroup GILIsMutable /// \brief Determines if the given view is mutable (i.e. its pixels can be changed) template
struct view_is_mutable : public iterator_is_mutable
{}; ////////////////////////////////////////////////// /// /// TYPE FACTORY METAFUNCTIONS /// Metafunctions returning GIL types from other GIL types /// ////////////////////////////////////////////////// /// \defgroup TypeFactoryFromElements xxx_type /// \ingroup TypeFactory /// \brief Returns the type of a homogeneous GIL construct given its elements (channel, layout, whether it is planar, step, mutable, etc.) /// \defgroup TypeFactoryFromPixel xxx_type_from_pixel /// \ingroup TypeFactory /// \brief Returns the type of a GIL construct given its pixel type, whether it is planar, step, mutable, etc. /// \defgroup TypeFactoryDerived derived_xxx_type /// \ingroup TypeFactory /// \brief Returns the type of a homogeneous GIL construct given a related construct by changing some of its properties /// \ingroup TypeFactoryFromElements /// \brief Returns the type of a homogeneous pixel reference given the channel type, layout, whether it operates on planar data and whether it is mutable template
struct pixel_reference_type{}; template
struct pixel_reference_type
{ typedef pixel
& type; }; template
struct pixel_reference_type
{ typedef const pixel
& type; }; template
struct pixel_reference_type
{ typedef const planar_pixel_reference
::reference,typename color_space_type
::type> type; }; // TODO: Assert M=identity template
struct pixel_reference_type
{ typedef const planar_pixel_reference
::const_reference,typename color_space_type
::type> type; };// TODO: Assert M=identity /// \ingroup TypeFactoryFromPixel /// \brief Returns the type of a pixel iterator given the pixel type, whether it operates on planar data, whether it is a step iterator, and whether it is mutable template
struct iterator_type_from_pixel{}; template
struct iterator_type_from_pixel
{ typedef Pixel* type; }; template
struct iterator_type_from_pixel
{ typedef const Pixel* type; }; template
struct iterator_type_from_pixel
{ typedef planar_pixel_iterator
::type>::pointer,typename color_space_type
::type> type; }; template
struct iterator_type_from_pixel
{ typedef planar_pixel_iterator
::type>::const_pointer,typename color_space_type
::type> type; }; template
struct iterator_type_from_pixel
{ typedef memory_based_step_iterator
::type> type; }; /// \ingroup TypeFactoryFromElements /// \brief Returns the type of a homogeneous iterator given the channel type, layout, whether it operates on planar data, whether it is a step iterator, and whether it is mutable template
struct iterator_type{}; template
struct iterator_type
{ typedef pixel
* type; }; template
struct iterator_type
{ typedef const pixel
* type; }; template
struct iterator_type
{ typedef planar_pixel_iterator
type; }; // TODO: Assert M=identity template
struct iterator_type
{ typedef planar_pixel_iterator
type; }; // TODO: Assert M=identity template
struct iterator_type
{ typedef memory_based_step_iterator
::type> type; }; /// \brief Given a pixel iterator defining access to pixels along a row, returns the types of the corresponding built-in step_iterator, xy_locator, image_view /// \ingroup TypeFactory template
struct type_from_x_iterator { typedef memory_based_step_iterator
step_iterator_t; typedef memory_based_2d_locator
xy_locator_t; typedef image_view
view_t; }; namespace detail { template
struct packed_channel_reference_type { typedef const packed_channel_reference
type; }; template
class packed_channel_references_vector_type { // If ChannelBitSizesVector is mpl::vector
// Then first_bits_vector will be mpl::vector
typedef typename mpl::accumulate
>, mpl::push_back
, mpl::_2> > >::type first_bits_vector; public: typedef typename mpl::transform
::type, ChannelBitSizesVector, packed_channel_reference_type
>::type type; }; } /// \ingroup TypeFactoryFromElements /// \brief Returns the type of a packed pixel given its bitfield type, the bit size of its channels and its layout. /// /// A packed pixel has channels that cover bit ranges but itself is byte aligned. RGB565 pixel is an example. /// /// The size of ChannelBitSizeVector must equal the number of channels in the given layout /// The sum of bit sizes for all channels must be less than or equal to the number of bits in BitField (and cannot exceed 64). /// If it is less than the number of bits in BitField, the last bits will be unused. template
struct packed_pixel_type { typedef packed_pixel
::type, Layout> type; }; /// \defgroup TypeFactoryPacked packed_image_type,bit_aligned_image_type /// \ingroup TypeFactoryFromElements /// \brief Returns the type of an image whose channels are not byte-aligned. /// /// A packed image is an image whose pixels are byte aligned, such as "rgb565".
/// A bit-aligned image is an image whose pixels are not byte aligned, such as "rgb222".
/// /// The sum of the bit sizes of all channels cannot exceed 64. /// \ingroup TypeFactoryPacked /// \brief Returns the type of an interleaved packed image: an image whose channels may not be byte-aligned, but whose pixels are byte aligned. template
> struct packed_image_type { typedef image
::type,false,Alloc> type; }; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a single-channel image given its bitfield type, the bit size of its channel and its layout template
> struct packed_image1_type : public packed_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a two channel image given its bitfield type, the bit size of its channels and its layout template
> struct packed_image2_type : public packed_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a three channel image given its bitfield type, the bit size of its channels and its layout template
> struct packed_image3_type : public packed_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a four channel image given its bitfield type, the bit size of its channels and its layout template
> struct packed_image4_type : public packed_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a five channel image given its bitfield type, the bit size of its channels and its layout template
> struct packed_image5_type : public packed_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a packed image whose pixels may not be byte aligned. For example, an "rgb222" image is bit-aligned because its pixel spans six bits. /// /// Note that the alignment parameter in the constructor of bit-aligned images is in bit units. For example, if you want to construct a bit-aligned /// image whose rows are byte-aligned, use 8 as the alignment parameter, not 1. template
> struct bit_aligned_image_type { private: BOOST_STATIC_CONSTANT(int, bit_size = (mpl::accumulate
, mpl::plus
>::type::value)); typedef typename detail::min_fast_uint
::type bitfield_t; typedef const bit_aligned_pixel_reference
bit_alignedref_t; public: typedef image
type; }; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a single-channel bit-aligned image given the bit size of its channel and its layout template
> struct bit_aligned_image1_type : public bit_aligned_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a two channel bit-aligned image given the bit size of its channels and its layout template
> struct bit_aligned_image2_type : public bit_aligned_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a three channel bit-aligned image given the bit size of its channels and its layout template
> struct bit_aligned_image3_type : public bit_aligned_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a four channel bit-aligned image given the bit size of its channels and its layout template
> struct bit_aligned_image4_type : public bit_aligned_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryPacked /// \brief Returns the type of a five channel bit-aligned image given the bit size of its channels and its layout template
> struct bit_aligned_image5_type : public bit_aligned_image_type
, Layout, Alloc> {}; /// \ingroup TypeFactoryFromElements /// \brief Returns the type of a homogeneous pixel given the channel type and layout template
struct pixel_value_type { typedef pixel
type; // by default use gil::pixel. Specializations are provided for }; // Specializations for packed channels template
struct pixel_value_type< packed_dynamic_channel_reference
,Layout> : public packed_pixel_type
, Layout> {}; template
struct pixel_value_type
,Layout> : public packed_pixel_type
, Layout> {}; template
struct pixel_value_type< packed_channel_reference
,Layout> : public packed_pixel_type
, Layout> {}; template
struct pixel_value_type
,Layout> : public packed_pixel_type
, Layout> {}; template
struct pixel_value_type
,Layout> : public packed_pixel_type
::type, mpl::vector1_c
, Layout> {}; /// \ingroup TypeFactoryFromElements /// \brief Returns the type of a homogeneous locator given the channel type, layout, whether it operates on planar data and whether it has a step horizontally template
struct locator_type { typedef typename type_from_x_iterator
::type>::xy_locator_type type; }; /// \ingroup TypeFactoryFromElements /// \brief Returns the type of a homogeneous view given the channel type, layout, whether it operates on planar data and whether it has a step horizontally template
struct view_type { typedef typename type_from_x_iterator
::type>::view_t type; }; /// \ingroup TypeFactoryFromElements /// \brief Returns the type of a homogeneous image given the channel type, layout, and whether it operates on planar data template
> struct image_type { typedef image
, IsPlanar, Alloc> type; }; /// \ingroup TypeFactoryFromPixel /// \brief Returns the type of a view the pixel type, whether it operates on planar data and whether it has a step horizontally template
struct view_type_from_pixel { typedef typename type_from_x_iterator
::type>::view_t type; }; /// \brief Constructs a pixel reference type from a source pixel reference type by changing some of the properties. /// \ingroup TypeFactoryDerived /// Use use_default for the properties of the source view that you want to keep template
class derived_pixel_reference_type { typedef typename remove_reference
::type pixel_t; typedef typename mpl::if_
, typename channel_type
::type, T >::type channel_t; typedef typename mpl::if_
, layout
::type, typename channel_mapping_type
::type>, L>::type layout_t; static const bool mut =mpl::if_
, pixel_reference_is_mutable
, IsMutable>::type::value; static const bool planar=mpl::if_
, is_planar
, IsPlanar>::type::value; public: typedef typename pixel_reference_type
::type type; }; /// \brief Constructs a pixel iterator type from a source pixel iterator type by changing some of the properties. /// \ingroup TypeFactoryDerived /// Use use_default for the properties of the source view that you want to keep template
class derived_iterator_type { typedef typename mpl::if_
, typename channel_type
::type, T >::type channel_t; typedef typename mpl::if_
, layout
::type, typename channel_mapping_type
::type>, L>::type layout_t; static const bool mut =mpl::if_
, iterator_is_mutable
, IsMutable>::type::value; static const bool planar=mpl::if_
, is_planar
, IsPlanar>::type::value; static const bool step =mpl::if_
, iterator_is_step
, IsStep>::type::value; public: typedef typename iterator_type
::type type; }; /// \brief Constructs an image view type from a source view type by changing some of the properties. /// \ingroup TypeFactoryDerived /// Use use_default for the properties of the source view that you want to keep template
class derived_view_type { typedef typename mpl::if_
, typename channel_type
::type, T>::type channel_t; typedef typename mpl::if_
, layout
::type, typename channel_mapping_type
::type>, L>::type layout_t; static const bool mut =mpl::if_
, view_is_mutable