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_REDUCE_HPP #define GIL_REDUCE_HPP #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "../../metafunctions.hpp" #include "../../typedefs.hpp" #include "dynamic_at_c.hpp" //////////////////////////////////////////////////////////////////////////////////////// /// \file /// \brief Constructs for static-to-dynamic integer convesion /// \author Lubomir Bourdev and Hailin Jin \n /// Adobe Systems Incorporated /// \date 2005-2007 \n Last updated on May 4, 2006 /// //////////////////////////////////////////////////////////////////////////////////////// #ifdef GIL_REDUCE_CODE_BLOAT // Max number of cases in the cross-expension of binary operation for it to be reduced as unary #define GIL_BINARY_REDUCE_LIMIT 226 namespace boost { namespace mpl { /////////////////////////////////////////////////////// /// Mapping vector - represents the mapping of one type vector to another /// It is not a full-blown MPL Random Access Type sequence; just has at_c and size implemented /// /// SrcTypes, DstTypes: MPL Random Access Type Sequences /// /// Implements size and at_c to behave as if this is an MPL vector of integers /////////////////////////////////////////////////////// template
struct mapping_vector {}; template
struct at_c
, K> { static const std::size_t value=size
::value - order
::type>::type::value +1; typedef size_t
type; }; template
struct size
> { typedef typename size
::type type; static const std::size_t value=type::value; }; /////////////////////////////////////////////////////// /// copy_to_vector - copies a sequence (mpl::set) to vector. /// /// Temporary solution because I couldn't get mpl::copy to do this. /// This is what I tried: /// mpl::copy
> >::type; /// It works when SET is mpl::vector, but not when SET is mpl::set... /////////////////////////////////////////////////////// namespace detail { template
struct copy_to_vector_impl { private: typedef typename deref
::type T; typedef typename next
::type next; typedef typename copy_to_vector_impl
::type rest; public: typedef typename push_front
::type type; }; template
struct copy_to_vector_impl
{ typedef vector
::type> type; }; } template
struct copy_to_vector { typedef typename detail::copy_to_vector_impl
::type, size
::value>::type type; }; template <> struct copy_to_vector
> { typedef vector0<> type; }; } } // boost::mpl namespace boost { namespace gil { /////////////////////////////////////////////////////// /// /// unary_reduce, binary_reduce - given an MPL Random Access Sequence, /// dynamically specified index to that container, the bits of an instance of the corresponding type and /// a generic operation, invokes the operation on the given type /// /////////////////////////////////////////////////////// /////////////////////////////////////////////////////// /// /// \brief Unary reduce. /// /// Given a set of types and an operation, reduces each type in the set (to reduced_t), then removes duplicates (to unique_t) /// To apply the operation, first constructs a lookup table that maps each element from Types to its place in unique_t and uses it to map /// the index to anther index (in map_index). Then invokes apply_operation_base on the unique types with the new index. /// /////////////////////////////////////////////////////// template
struct unary_reduce_impl { typedef typename mpl::transform
>::type reduced_t; typedef typename mpl::copy
, mpl::insert
> >::type unique_t; static const bool is_single=mpl::size
::value==1; }; template
::is_single> struct unary_reduce : public unary_reduce_impl
{ typedef typename unary_reduce_impl
::reduced_t reduced_t; typedef typename unary_reduce_impl
::unique_t unique_t; static unsigned short inline map_index(std::size_t index) { typedef typename mpl::mapping_vector
indices_t; return gil::at_c
(index); } template
GIL_FORCEINLINE static typename Op::result_type applyc(const Bits& bits, std::size_t index, Op op) { return apply_operation_basec
(bits,map_index(index),op); } template
GIL_FORCEINLINE static typename Op::result_type apply(Bits& bits, std::size_t index, Op op) { return apply_operation_base
(bits,map_index(index),op); } }; template
struct unary_reduce
: public unary_reduce_impl
{ typedef typename unary_reduce_impl
::unique_t unique_t; static unsigned short inline map_index(std::size_t index) { return 0; } template
GIL_FORCEINLINE static typename Op::result_type applyc(const Bits& bits, std::size_t index, Op op) { return op(*gil_reinterpret_cast_c
::type*>(&bits)); } template
GIL_FORCEINLINE static typename Op::result_type apply(Bits& bits, std::size_t index, Op op) { return op(*gil_reinterpret_cast
::type*>(&bits)); } }; /////////////////////////////////////////////////////// /// /// \brief Binary reduce. /// /// Given two sets of types, Types1 and Types2, first performs unary reduction on each. Then checks if the product of their sizes is above /// the GIL_BINARY_REDUCE_LIMIT limit. If so, the operation is too complex to be binary-reduced and uses a specialization of binary_reduce_impl /// to simply call the binary apply_operation_base (which performs two nested 1D apply operations) /// If the operation is not too complex, uses the other specialization of binary_reduce_impl to create a cross-product of the input types /// and performs unary reduction on the result (bin_reduced_t). To apply the binary operation, it simply invokes a unary apply_operation_base /// on the reduced cross-product types /// /////////////////////////////////////////////////////// namespace detail { struct pair_generator { template
struct apply { typedef std::pair
::type*, const typename mpl::at_c
::type*> type; }; }; // When the types are not too large, applies reduce on their cross product template
struct binary_reduce_impl { //private: typedef typename mpl::copy_to_vector
::type vec1_types; typedef typename mpl::copy_to_vector
::type vec2_types; typedef mpl::cross_vector
, pair_generator> BIN_TYPES; typedef unary_reduce
bin_reduced_t; static unsigned short inline map_index(std::size_t index1, std::size_t index2) { unsigned short r1=Unary1::map_index(index1); unsigned short r2=Unary2::map_index(index2); return bin_reduced_t::map_index(r2*mpl::size
::value + r1); } public: typedef typename bin_reduced_t::unique_t unique_t; template
static typename Op::result_type inline apply(const Bits1& bits1, std::size_t index1, const Bits2& bits2, std::size_t index2, Op op) { std::pair
pr(&bits1, &bits2); return apply_operation_basec
(pr, map_index(index1,index2),op); } }; // When the types are large performs a double-dispatch. Binary reduction is not done. template
struct binary_reduce_impl
{ template
static typename Op::result_type inline apply(const Bits1& bits1, std::size_t index1, const Bits2& bits2, std::size_t index2, Op op) { return apply_operation_base
(bits1, index1, bits2, index2, op); } }; } template
struct binary_reduce { //private: typedef unary_reduce
unary1_t; typedef unary_reduce
unary2_t; static const std::size_t CROSS_SIZE = mpl::size
::value * mpl::size
::value; typedef detail::binary_reduce_impl
GIL_BINARY_REDUCE_LIMIT)> impl; public: template
static typename Op::result_type inline apply(const Bits1& bits1, std::size_t index1, const Bits2& bits2, std::size_t index2, Op op) { return impl::apply(bits1,index1,bits2,index2,op); } }; template
GIL_FORCEINLINE typename UnaryOp::result_type apply_operation(variant
& arg, UnaryOp op) { return unary_reduce
::template apply(arg._bits, arg._index ,op); } template
GIL_FORCEINLINE typename UnaryOp::result_type apply_operation(const variant
& arg, UnaryOp op) { return unary_reduce
::template applyc(arg._bits, arg._index ,op); } template
GIL_FORCEINLINE typename BinaryOp::result_type apply_operation(const variant
& arg1, const variant
& arg2, BinaryOp op) { return binary_reduce
::template apply(arg1._bits, arg1._index, arg2._bits, arg2._index, op); } #undef GIL_BINARY_REDUCE_LIMIT } } // namespace gil namespace boost { namespace mpl { /////////////////////////////////////////////////////// /// \brief Represents the virtual cross-product of the types generated from VecOfVecs. /// \ingroup CrossVector /// INPUT: /// VecOfVecs - a vector of vector types. For example [ [A1,A2,A3], [B1,B2], [C1,C2,C3,C4] ] /// Each element must be a non-empty mpl vector /// TypeGen - a metafunction that generates a type from a vector of types, each of which can be /// selected from the corresponding vector in VecOfVecs. For example, [A1, B2, C4] /// /// Represents the virtual cross-product of the types generated from VecOfVecs. /// For example, [ TypeGen[A1,B1,C1], TypeGen[A2,B1,C1], TypeGen[A3,B1,C1], /// TypeGen[A1,B2,C1], TypeGen[A2,B2,C1], TypeGen[A3,B2,C1], /// TypeGen[A1,B1,C2], TypeGen[A2,B1,C2], TypeGen[A3,B1,C2], ... ] /// /// Models an immutable MPL Random Access Sequence /// Traversal, random-access, etc, is defined, but mutable operations, /// such as push_back and pop_front are not supported /////////////////////////////////////////////////////// template
struct cross_vector {}; /// \brief Iterator of cross_vector /// \ingroup CrossVectorIterator template
struct cross_iterator { typedef mpl::random_access_iterator_tag category; }; /////////////////////////////////////////////////////// /// Implementation of the iterator functions of cross vector /////////////////////////////////////////////////////// /// \brief Dereferences a cross-vector iterator /// \ingroup CrossVectorIterator /// Creates a vector of the sizes of each type vector in VecOfVecs, then uses it as a basis /// to represent the iterator's position K as a vector of indices. Extracts the corresponding type of /// each input vector and passes the element types to the type generation function, which returns the dereferenced type template
struct deref
> { private: typedef typename detail::select_subvector_c
::type DerefTypes; public: typedef typename TypeGen::template apply
::type type; }; /// \brief Increments a cross-vector iterator. /// \ingroup CrossVectorIterator template
struct next
> { typedef cross_iterator
type; }; /// \brief Decrements a cross-vector iterator. /// \ingroup CrossVectorIterator template
struct prior
> { typedef cross_iterator
type; }; /// \brief Advances a cross-vector iterator. /// \ingroup CrossVectorIterator template
struct advance
, Distance > { typedef cross_iterator
type; }; /// \brief Computes the distance between two cross-vector iterator-s. /// \ingroup CrossVectorIterator // (shortened the names of the template arguments - otherwise doxygen cannot parse this...) template
struct distance
, cross_iterator
> { typedef size_t
type; }; /////////////////////////////////////////////////////// /// Implementation of cross vector /////////////////////////////////////////////////////// /// \brief Computes the size of a cross vector as the product of the sizes of all vectors in VecOfVecs /// \ingroup CrossVector template
struct size
> { typedef typename fold
, times<_1, size<_2> > >::type type; static const std::size_t value=type::value; }; /// \brief Determines whether a cross vector is empty /// \ingroup CrossVector template
struct empty
> { typedef typename empty
::type type; }; /// \brief Returns the K-th element of a cross vector /// \ingroup CrossVector template
struct at
, K> { private: typedef cross_iterator
KthIterator; public: typedef typename deref
::type type; }; /// \brief Returns an iterator to the first element of a cross vector /// \ingroup CrossVector template
struct begin
> { typedef cross_iterator
type; }; /// \brief Returns an iterator to the last element of a cross vector /// \ingroup CrossVector template
struct end
> { private: typedef cross_vector
this_t; public: typedef cross_iterator
::value> type; }; /// \brief Returns the first element of a cross vector /// \ingroup CrossVector template
struct front
> { private: typedef cross_vector
this_t; public: typedef typename deref
::type>::type type; }; /// \brief Returns the last element of a cross vector /// \ingroup CrossVector template
struct back
> { private: typedef cross_vector
this_t; typedef typename size
::type size; typedef typename minus
>::type last_index; public: typedef typename at
::type type; }; /// \brief Transforms the elements of a cross vector /// \ingroup CrossVector template
struct transform
, OPP > { typedef typename lambda
::type Op; struct adapter { template
struct apply { typedef typename TypeGen::template apply
::type orig_t; typedef typename Op::template apply
::type type; }; }; typedef cross_vector
type; }; } } // boost::mpl namespace boost { namespace gil { template
struct type_to_index; template
struct view_is_basic; struct rgb_t; struct lab_t; struct hsb_t; struct cmyk_t; struct rgba_t; struct error_t; namespace detail { //////////////////////////////////////////////////////// //// //// Generic reduce operation //// //////////////////////////////////////////////////////// template
struct reduce { typedef T type; }; //////////////////////////////////////////////////////// //// //// Unary reduce_view operation. Splits into basic and non-basic views. //// Algorithm-specific reduce should specialize for basic views //// //////////////////////////////////////////////////////// template
struct reduce_view_basic { typedef View type; }; template
struct reduce
> : public reduce_view_basic
,view_is_basic
>::value> {}; //////////////////////////////////////////////////////// //// //// Unary reduce_image operation. Splits into basic and non-basic images. //// Algorithm-specific reduce should specialize for basic images //// //////////////////////////////////////////////////////// template
struct reduce_image_basic { typedef Img type; }; template
struct reduce
> : public reduce_image_basic
,image_is_basic
>::value > {}; //////////////////////////////////////////////////////// //// //// Binary reduce_view operation. Splits into basic and non-basic views. //// Algorithm-specific reduce should specialize for basic views //// //////////////////////////////////////////////////////// template
struct reduce_views_basic { typedef std::pair
type; }; template
struct reduce
*, const image_view
*> > : public reduce_views_basic
,image_view
, mpl::and_
>, view_is_basic
> >::value > {}; //////////////////////////////////////////////////////// //// //// Color space unary reduce operation. Reduce a color space to a base with the same number of channels //// //////////////////////////////////////////////////////// template
struct reduce_color_space { typedef Cs type; }; template <> struct reduce_color_space
{ typedef rgb_t type; }; template <> struct reduce_color_space
{ typedef rgb_t type; }; template <> struct reduce_color_space
{ typedef rgba_t type; }; /* //////////////////////////////////////////////////////// //// //// Color space binary reduce operation. Given a source and destination color spaces, //// returns a reduced source and destination color spaces that have the same mapping of channels //// //// Precondition: The two color spaces must be compatible (i.e. must have the same set of channels) //////////////////////////////////////////////////////// template
struct type_vec_to_integer_impl { typedef typename mpl::back
::type last; typedef typename mpl::pop_back
::type rest; static const int value = type_vec_to_integer_impl
::value * Basis + last::value; }; template
struct type_vec_to_integer_impl
{ static const int value=0; }; template
struct type_vec_to_integer { static const int value = type_vec_to_integer_impl
::value>::value; }; // Given two color spaces and the mapping of the channels between them, returns the reduced pair of color spaces // The default version performs no reduction template
struct reduce_color_spaces_impl { typedef SrcColorSpace first_t; typedef DstColorSpace second_t; }; // 012: RGB-RGB, bgr-bgr, lab-lab, hsb-hsb template
struct reduce_color_spaces_impl
{ typedef rgb_t first_t; typedef rgb_t second_t; }; // 210: RGB-bgr, bgr-RGB template
struct reduce_color_spaces_impl
{ typedef rgb_t first_t; typedef bgr_t second_t; }; // 0123: RGBA-RGBA, bgra-bgra, argb-argb, abgr-abgr cmyk-cmyk template
struct reduce_color_spaces_impl
{ typedef rgba_t first_t; typedef rgba_t second_t; }; // 3210: RGBA-abgr, bgra-argb, argb-bgra, abgr-RGBA template
struct reduce_color_spaces_impl
{ typedef rgba_t first_t; typedef abgr_t second_t; }; // 1230: RGBA-argb, bgra-abgr template
struct reduce_color_spaces_impl
{ typedef rgba_t first_t; typedef argb_t second_t; }; // 2103: RGBA-bgra, bgra-RGBA (uses subclass to ensure that base color space is not reduced to derived) template
struct reduce_color_spaces_impl
{ typedef rgba_t first_t; typedef bgra_t second_t; }; // 3012: argb-RGBA, abgr-bgra template
struct reduce_color_spaces_impl
{ typedef argb_t first_t; typedef rgba_t second_t; }; // 0321: argb-abgr, abgr-argb template
struct reduce_color_spaces_impl
{ typedef argb_t first_t; typedef abgr_t second_t; }; template
struct reduce_color_spaces { typedef typename channel_order
::type src_order_t; typedef typename channel_order
::type dst_order_t; typedef typename mpl::transform
>::type mapping; static const int mapping_val = type_vec_to_integer
::value; typedef typename reduce_color_spaces_impl
::first_t _first_t; typedef typename reduce_color_spaces_impl
::second_t _second_t; typedef typename mpl::and_
, mpl::not_< color_space_is_base<_second_t> > > swap_t; public: typedef typename mpl::if_
::type first_t; typedef typename mpl::if_
::type second_t; }; */ // TODO: Use the old code for reduce_color_spaces above to do color layout reduction template
struct reduce_color_layouts { typedef SrcLayout first_t; typedef DstLayout second_t; }; //////////////////////////////////////////////////////// //// //// Reduce for copy_pixels //// //////////////////////////////////////////////////////// struct copy_pixels_fn; /* // 1D reduce for copy_pixels reduces the channel to mutable and the color space to its base with same dimensions template
struct reduce_view_basic
{ private: typedef typename reduce_color_space
::type Cs; // reduce the color space typedef layout
layout_t; public: typedef typename derived_view_type
::type type; }; */ // Incompatible views cannot be used in copy_pixels - will throw std::bad_cast template
struct reduce_copy_pixop_compat { typedef error_t type; }; // For compatible basic views, reduce their color spaces based on their channel mapping. // Make the source immutable and the destination mutable (they should already be that way) template
struct reduce_copy_pixop_compat
{ typedef layout
layout1; typedef layout
layout2; typedef typename reduce_color_layouts
::first_t L1; typedef typename reduce_color_layouts
::second_t L2; typedef typename derived_view_type
::type DV1; typedef typename derived_view_type
::type DV2; typedef std::pair
type; }; // The general 2D version branches into compatible and incompatible views template
struct reduce_views_basic
: public reduce_copy_pixop_compat
, view_is_mutable
>::value > { }; //////////////////////////////////////////////////////// //// //// Reduce for variant destructor (basic views have no destructor) //// //////////////////////////////////////////////////////// struct destructor_op; template
struct reduce_view_basic
{ typedef gray8_view_t type; }; //////////////////////////////////////////////////////// //// //// Reduce for get_dimensions (basic views and images have the same structure and the dimensions are contained at the beginning) //// //////////////////////////////////////////////////////// struct any_type_get_dimensions; template
struct reduce_view_basic
{ typedef gray8_view_t type; }; template
struct reduce_image_basic
{ typedef gray8_image_t type; }; //////////////////////////////////////////////////////// //// //// Reduce for get_num_channels (only color space matters) //// //////////////////////////////////////////////////////// struct any_type_get_num_channels; template
struct reduce_view_basic
{ typedef typename View::color_space_t::base Cs; typedef typename view_type
::type>::type type; }; template
struct reduce_image_basic
{ typedef typename Img::color_space_t::base Cs; typedef typename image_type
::type>::type type; }; //////////////////////////////////////////////////////// //// //// Reduce for resample_pixels (same as copy_pixels) //// //////////////////////////////////////////////////////// template
struct resample_pixels_fn; template
struct reduce_view_basic
, V, IsBasic> : public reduce_view_basic
{}; template
struct reduce_views_basic
, V1, V2, IsBasic> : public reduce_views_basic
{}; //////////////////////////////////////////////////////// //// //// Reduce for copy_and_convert_pixels //// (the only reduction could be made when views are compatible and have the same mapping, planarity and stepness) //// //////////////////////////////////////////////////////// template
class copy_and_convert_pixels_fn; // the only thing for 1D reduce is making them all mutable... template
struct reduce_view_basic
, View, IsBasic> : public derived_view_type
{ }; // For 2D reduce, if they have the same channels and color spaces (i.e. the same pixels) then copy_and_convert is just copy. // In this case, reduce their common color space. In general make the first immutable and the second mutable template