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_BIT_ALIGNED_PIXEL_REFERENCE_HPP #define GIL_BIT_ALIGNED_PIXEL_REFERENCE_HPP //////////////////////////////////////////////////////////////////////////////////////// /// \file /// \brief A model of a heterogeneous pixel that is not byte aligned. Examples are bitmap (1-bit pixels) or 6-bit RGB (222) /// \author Lubomir Bourdev and Hailin Jin \n /// Adobe Systems Incorporated /// \date 2005-2007 \n Last updated on September 28, 2006 /// //////////////////////////////////////////////////////////////////////////////////////// #include
#include
#include
#include
#include
#include
#include
#include
#include "gil_config.hpp" #include "pixel.hpp" #include "channel.hpp" namespace boost { namespace gil { ///////////////////////////// // bit_range // // Represents a range of bits that can span multiple consecutive bytes. The range has a size fixed at compile time, but the offset is specified at run time. ///////////////////////////// template
class bit_range { public: typedef typename mpl::if_c
::type byte_t; typedef std::ptrdiff_t difference_type; template
friend class bit_range; private: byte_t* _current_byte; // the starting byte of the bit range int _bit_offset; // offset from the beginning of the current byte. 0<=_bit_offset<=7 public: bit_range() : _current_byte(NULL), _bit_offset(0) {} bit_range(byte_t* current_byte, int bit_offset) : _current_byte(current_byte), _bit_offset(bit_offset) { assert(bit_offset>=0 && bit_offset<8); } bit_range(const bit_range& br) : _current_byte(br._current_byte), _bit_offset(br._bit_offset) {} template
bit_range(const bit_range
& br) : _current_byte(br._current_byte), _bit_offset(br._bit_offset) {} bit_range& operator=(const bit_range& br) { _current_byte = br._current_byte; _bit_offset=br._bit_offset; return *this; } bool operator==(const bit_range& br) const { return _current_byte==br._current_byte && _bit_offset==br._bit_offset; } bit_range& operator++() { _current_byte += (_bit_offset+RangeSize) / 8; _bit_offset = (_bit_offset+RangeSize) % 8; return *this; } bit_range& operator--() { bit_advance(-RangeSize); return *this; } void bit_advance(difference_type num_bits) { int new_offset = int(_bit_offset+num_bits); _current_byte += new_offset / 8; _bit_offset = new_offset % 8; if (_bit_offset<0) { _bit_offset+=8; --_current_byte; } } difference_type bit_distance_to(const bit_range& b) const { return (b.current_byte() - current_byte())*8 + b.bit_offset()-bit_offset(); } byte_t* current_byte() const { return _current_byte; } int bit_offset() const { return _bit_offset; } }; /// \defgroup ColorBaseModelNonAlignedPixel bit_aligned_pixel_reference /// \ingroup ColorBaseModel /// \brief A heterogeneous color base representing pixel that may not be byte aligned, i.e. it may correspond to a bit range that does not start/end at a byte boundary. Models ColorBaseConcept. /** \defgroup PixelModelNonAlignedPixel bit_aligned_pixel_reference \ingroup PixelModel \brief A heterogeneous pixel reference used to represent non-byte-aligned pixels. Models PixelConcept Example: \code unsigned char data=0; // A mutable reference to a 6-bit BGR pixel in "123" format (1 bit for red, 2 bits for green, 3 bits for blue) typedef const bit_aligned_pixel_reference
, rgb_layout_t, true> rgb123_ref_t; // create the pixel reference at bit offset 2 // (i.e. red = [2], green = [3,4], blue = [5,6,7] bits) rgb123_ref_t ref(&data, 2); get_color(ref, red_t()) = 1; assert(data == 0x04); get_color(ref, green_t()) = 3; assert(data == 0x1C); get_color(ref, blue_t()) = 7; assert(data == 0xFC); \endcode */ /// \ingroup ColorBaseModelNonAlignedPixel PixelModelNonAlignedPixel PixelBasedModel /// \brief Heterogeneous pixel reference corresponding to non-byte-aligned bit range. Models ColorBaseConcept, PixelConcept, PixelBasedConcept template
typename Layout, bool IsMutable> struct bit_aligned_pixel_reference { BOOST_STATIC_CONSTANT(int, bit_size = (mpl::accumulate
, mpl::plus
>::type::value)); typedef bit_range
bit_range_t; typedef BitField bitfield_t; typedef typename mpl::if_c
::type data_ptr_t; typedef Layout layout_t; typedef typename packed_pixel_type
::type value_type; typedef const bit_aligned_pixel_reference reference; typedef const bit_aligned_pixel_reference
const_reference; BOOST_STATIC_CONSTANT(bool, is_mutable = IsMutable); bit_aligned_pixel_reference(){} bit_aligned_pixel_reference(data_ptr_t data_ptr, int bit_offset) : _bit_range(data_ptr, bit_offset) {} explicit bit_aligned_pixel_reference(const bit_range_t& bit_range) : _bit_range(bit_range) {} template
bit_aligned_pixel_reference(const bit_aligned_pixel_reference
& p) : _bit_range(p._bit_range) {} // Grayscale references can be constructed from the channel reference explicit bit_aligned_pixel_reference(const typename kth_element_type
::type channel0) : _bit_range(static_cast
(&channel0), channel0.first_bit()) { BOOST_STATIC_ASSERT((num_channels
::value==1)); } // Construct from another compatible pixel type bit_aligned_pixel_reference(const bit_aligned_pixel_reference& p) : _bit_range(p._bit_range) {} template
bit_aligned_pixel_reference(packed_pixel
& p) : _bit_range(static_cast
(&at_c<0>(p)), at_c<0>(p).first_bit()) { check_compatible
>(); } const bit_aligned_pixel_reference& operator=(const bit_aligned_pixel_reference& p) const { static_copy(p,*this); return *this; } template
const bit_aligned_pixel_reference& operator=(const P& p) const { assign(p, mpl::bool_
::value>()); return *this; } template
bool operator==(const P& p) const { return equal(p, mpl::bool_
::value>()); } template
bool operator!=(const P& p) const { return !(*this==p); } const bit_aligned_pixel_reference* operator->() const { return this; } const bit_range_t& bit_range() const { return _bit_range; } private: mutable bit_range_t _bit_range; template
friend struct bit_aligned_pixel_reference; template
static void check_compatible() { gil_function_requires
>(); } template
void assign(const Pixel& p, mpl::true_) const { check_compatible
(); static_copy(p,*this); } template
bool equal(const Pixel& p, mpl::true_) const { check_compatible
(); return static_equal(*this,p); } private: static void check_gray() { BOOST_STATIC_ASSERT((is_same
::value)); } template
void assign(const Channel& chan, mpl::false_) const { check_gray(); at_c<0>(*this)=chan; } template
bool equal (const Channel& chan, mpl::false_) const { check_gray(); return at_c<0>(*this)==chan; } }; ///////////////////////////// // ColorBasedConcept ///////////////////////////// template
struct kth_element_type
, K> { public: typedef const packed_dynamic_channel_reference
::type::value, IsMutable> type; }; template
struct kth_element_reference_type
, K> : public kth_element_type
, K> {}; template
struct kth_element_const_reference_type
, K> : public kth_element_type
, K> {}; namespace detail { // returns sum of IntegralVector[0] ... IntegralVector[K-1] template
struct sum_k : public mpl::plus
, typename mpl::at_c
::type > {}; template
struct sum_k
: public mpl::int_<0> {}; } // at_c required by MutableColorBaseConcept template
inline typename kth_element_reference_type
,K>::type at_c(const bit_aligned_pixel_reference
& p) { typedef bit_aligned_pixel_reference
pixel_t; typedef typename kth_element_reference_type
::type channel_t; typedef typename pixel_t::bit_range_t bit_range_t; bit_range_t bit_range(p.bit_range()); bit_range.bit_advance(detail::sum_k
::value); return channel_t(bit_range.current_byte(), bit_range.bit_offset()); } ///////////////////////////// // PixelConcept ///////////////////////////// /// Metafunction predicate that flags bit_aligned_pixel_reference as a model of PixelConcept. Required by PixelConcept template
struct is_pixel
> : public mpl::true_{}; ///////////////////////////// // PixelBasedConcept ///////////////////////////// template
struct color_space_type
> { typedef typename L::color_space_t type; }; template
struct channel_mapping_type
> { typedef typename L::channel_mapping_t type; }; template
struct is_planar
> : mpl::false_ {}; ///////////////////////////// // pixel_reference_type ///////////////////////////// namespace detail { // returns a vector containing K copies of the type T template
struct k_copies; template
struct k_copies<0,T> { typedef mpl::vector0<> type; }; template
struct k_copies : public mpl::push_back
::type, T> {}; } // Constructs a homogeneous bit_aligned_pixel_reference given a channel reference template
struct pixel_reference_type
, Layout, false, false> { private: typedef typename mpl::size
::type size_t; typedef typename detail::k_copies
>::type channel_bit_sizes_t; public: typedef bit_aligned_pixel_reference
type; }; // Same but for the mutable case. We cannot combine the mutable and read-only cases because this triggers ambiguity template
struct pixel_reference_type
, Layout, false, true> { private: typedef typename mpl::size
::type size_t; typedef typename detail::k_copies
>::type channel_bit_sizes_t; public: typedef bit_aligned_pixel_reference
type; }; } } // namespace boost::gil namespace std { // We are forced to define swap inside std namespace because on some platforms (Visual Studio 8) STL calls swap qualified. // swap with 'left bias': // - swap between proxy and anything // - swap between value type and proxy // - swap between proxy and proxy // Having three overloads allows us to swap between different (but compatible) models of PixelConcept template
inline void swap(boost::gil::bit_aligned_pixel_reference
x, R& y) { boost::gil::swap_proxy
::value_type>(x,y); } template
inline void swap(typename boost::gil::bit_aligned_pixel_reference
::value_type& x, boost::gil::bit_aligned_pixel_reference
y) { boost::gil::swap_proxy
::value_type>(x,y); } template
inline void swap(boost::gil::bit_aligned_pixel_reference
x, boost::gil::bit_aligned_pixel_reference
y) { boost::gil::swap_proxy
::value_type>(x,y); } } // namespace std #endif
bit_aligned_pixel_reference.hpp
Page URL
File URL
Prev
3/34
Next
Download
( 14 KB )
Note: The DriveHQ service banners will NOT be displayed if the file owner is a paid member.
Comments
Total ratings:
0
Average rating:
Not Rated
Would you like to comment?
Join DriveHQ
for a free account, or
Logon
if you are already a member.