diff options
Diffstat (limited to 'basebmp/inc/basebmp/packedpixeliterator.hxx')
-rw-r--r-- | basebmp/inc/basebmp/packedpixeliterator.hxx | 680 |
1 files changed, 0 insertions, 680 deletions
diff --git a/basebmp/inc/basebmp/packedpixeliterator.hxx b/basebmp/inc/basebmp/packedpixeliterator.hxx deleted file mode 100644 index f02ced1b39..0000000000 --- a/basebmp/inc/basebmp/packedpixeliterator.hxx +++ /dev/null @@ -1,680 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_BASEBMP_PACKEDPIXELITERATOR_HXX -#define INCLUDED_BASEBMP_PACKEDPIXELITERATOR_HXX - -#include <basebmp/metafunctions.hxx> -#include <basebmp/stridedarrayiterator.hxx> -#include <basebmp/nonstandarditerator.hxx> -#include <basebmp/accessortraits.hxx> - -#include <boost/static_assert.hpp> -#include <vigra/metaprogramming.hxx> -#include <vigra/diff2d.hxx> - -namespace basebmp -{ - -/// Get bitmask for data at given intra-word position, for given bit depth -template< typename value_type, - int bits_per_pixel, - bool MsbFirst, - typename difference_type > -inline value_type get_mask( difference_type d ) -{ - BOOST_STATIC_ASSERT(bits_per_pixel > 0); - BOOST_STATIC_ASSERT(sizeof(value_type)*8 % bits_per_pixel == 0); - BOOST_STATIC_ASSERT(sizeof(value_type)*8 / bits_per_pixel > 1); - BOOST_STATIC_ASSERT(vigra::TypeTraits<value_type>::isPOD::asBool); - - const unsigned int nIntraWordPositions( sizeof(value_type)*8 / bits_per_pixel ); - - // create bits_per_pixel 1s shift to intra-word position - return ((~(~0 << bits_per_pixel)) << bits_per_pixel*(MsbFirst ? - (nIntraWordPositions-1 - (d % nIntraWordPositions)) : - (d % nIntraWordPositions))); -} - -template< int num_intraword_positions, int bits_per_pixel, bool MsbFirst, typename difference_type > inline difference_type get_shift( difference_type remainder ) -{ - return bits_per_pixel*(MsbFirst ? - (num_intraword_positions - 1 - remainder) : - remainder); -} - -template< typename Valuetype, - int bits_per_pixel, - bool MsbFirst > class PackedPixelColumnIterator : public NonStandardIterator -{ -public: - // no reference, no index_reference type here - typedef Valuetype value_type; - typedef int difference_type; - typedef image_traverser_tag iterator_category; - - typedef typename remove_const<value_type>::type mask_type; - typedef value_type* pointer; - typedef StridedArrayIterator< value_type > MoveY; - - enum { - /** The number of pixel within a single value_type value - */ - num_intraword_positions=sizeof(value_type)*8/bits_per_pixel, - /** Bit mask for one pixel (least significant bits) - */ - bit_mask=~(~0 << bits_per_pixel) - }; - -private: - MoveY y; - mask_type mask_; - difference_type shift_; - - void inc() - { - ++y; - } - - void dec() - { - --y; - } - - bool equal( PackedPixelColumnIterator const & rhs ) const - { - return rhs.y == y; - } - - bool less( PackedPixelColumnIterator const & rhs ) const - { - return y < rhs.y; - } - -public: - PackedPixelColumnIterator() : - y(0), - mask_( get_mask<value_type, bits_per_pixel, MsbFirst, difference_type>(0) ), - shift_( get_shift<num_intraword_positions, bits_per_pixel, MsbFirst, difference_type>(0) ) - {} - - PackedPixelColumnIterator( const MoveY& base, difference_type remainder ) : - y(base), - mask_( get_mask<value_type, bits_per_pixel, MsbFirst>(remainder) ), - shift_( get_shift<num_intraword_positions, bits_per_pixel, MsbFirst>(remainder) ) - {} - - PackedPixelColumnIterator& operator+=( difference_type d ) - { - y += d; - return *this; - } - - PackedPixelColumnIterator& operator-=( difference_type d ) - { - y -= d; - return *this; - } - - PackedPixelColumnIterator operator+( difference_type d ) - { - PackedPixelColumnIterator res(*this); - res += d; - return res; - } - - PackedPixelColumnIterator operator-( difference_type d ) - { - PackedPixelColumnIterator res(*this); - res -= d; - return res; - } - - PackedPixelColumnIterator& operator++() - { - inc(); - return *this; - } - - PackedPixelColumnIterator& operator--() - { - dec(); - return *this; - } - - PackedPixelColumnIterator operator++(int) - { - PackedPixelColumnIterator res(*this); - inc(); - return res; - } - - PackedPixelColumnIterator operator--(int) - { - PackedPixelColumnIterator res(*this); - dec(); - return res; - } - - bool operator==(PackedPixelColumnIterator const & rhs) const - { - return equal( rhs ); - } - - bool operator!=(PackedPixelColumnIterator const & rhs) const - { - return !equal( rhs ); - } - - bool operator<(PackedPixelColumnIterator const & rhs) const - { - return less(rhs); - } - - bool operator<=(PackedPixelColumnIterator const & rhs) const - { - return !rhs.less(*this); - } - - bool operator>(PackedPixelColumnIterator const & rhs) const - { - return rhs.less(*this); - } - - bool operator>=(PackedPixelColumnIterator const & rhs) const - { - return !less(rhs); - } - - difference_type operator-(PackedPixelColumnIterator const & rhs) const - { - return y - rhs.y; - } - - value_type get() const - { - return unsigned_cast<value_type>(*y() & mask_) >> shift_; - } - - value_type get(difference_type d) const - { - return unsigned_cast<value_type>(*y(d) & mask_) >> shift_; - } - - void set( value_type v ) const - { - const value_type pixel_value( (v << shift_) & mask_ ); - *y() = (*y() & ~mask_) | pixel_value; - } - - void set( value_type v, difference_type d ) const - { - const value_type pixel_value( (v << shift_) & mask_ ); - *y(d) = (*y(d) & ~mask_) | pixel_value; - } -}; - -template< typename Valuetype, - int bits_per_pixel, - bool MsbFirst > class PackedPixelRowIterator : public NonStandardIterator -{ -public: - // no reference, no index_reference type here - typedef Valuetype value_type; - typedef int difference_type; - typedef image_traverser_tag iterator_category; - - typedef typename remove_const<value_type>::type mask_type; - typedef value_type* pointer; - - enum { - /** The number of pixel within a single value_type value - */ - num_intraword_positions=sizeof(value_type)*8/bits_per_pixel, - /** Bit mask for one pixel (least significant bits) - */ - bit_mask=~(~0 << bits_per_pixel) - }; - -private: - pointer data_; - mask_type mask_; - difference_type remainder_; - - void update_mask() - { - mask_ = get_mask<value_type, bits_per_pixel, MsbFirst>(remainder_); - } - - void inc() - { - const difference_type newValue( remainder_ + 1 ); - const difference_type data_offset( newValue / num_intraword_positions ); - - data_ += data_offset; - remainder_ = newValue % num_intraword_positions; - - const mask_type shifted_mask( - MsbFirst ? - unsigned_cast<mask_type>(mask_) >> bits_per_pixel : - mask_ << bits_per_pixel ); - - // data_offset is 0 for shifted mask, and 1 for wrapped-around mask - mask_ = (1-data_offset)*shifted_mask + data_offset*(MsbFirst ? - bit_mask << bits_per_pixel*(num_intraword_positions-1) : - bit_mask); - } - - void dec() - { - const difference_type newValue( remainder_ - 1 ); - const bool isNegative( is_negative(newValue) ); - const difference_type newRemainder( newValue % num_intraword_positions ); - - // calc data_ += newValue / num_intraword_positions; - // remainder_ = newRemainder; - // for newValue >= 0, and - // data_ += newValue / num_intraword_positions - 1; - // remainder_ = num_intraword_positions - newRemainder; - // (to force remainder_ to be positive). - // This is branch-free, if is_negative() is branch-free - const difference_type data_offset( newValue / num_intraword_positions - isNegative ); - data_ += data_offset; - remainder_ = newRemainder + isNegative*num_intraword_positions; - - const mask_type shifted_mask( - MsbFirst ? - mask_ << bits_per_pixel : - unsigned_cast<mask_type>(mask_) >> bits_per_pixel ); - - // data_offset is 0 for shifted mask, and 1 for wrapped-around mask - mask_ = (1-data_offset)*shifted_mask + data_offset*(MsbFirst ? - bit_mask : - bit_mask << bits_per_pixel*(num_intraword_positions-1)); - } - - bool equal( PackedPixelRowIterator const & rhs ) const - { - return rhs.data_ == data_ && rhs.remainder_ == remainder_; - } - - bool less( PackedPixelRowIterator const & rhs ) const - { - return data_ == rhs.data_ ? - (remainder_ < rhs.remainder_) : - (data_ < rhs.data_); - } - -public: - PackedPixelRowIterator() : - data_(0), - mask_( get_mask<value_type, bits_per_pixel, MsbFirst, difference_type>(0) ), - remainder_(0) - {} - - explicit PackedPixelRowIterator( pointer base, int x ) : - data_(base), - mask_(0), - remainder_(x % num_intraword_positions) - { - update_mask(); - } - - PackedPixelRowIterator& operator+=( difference_type d ) - { - const difference_type newValue( remainder_ + d ); - const bool isNegative( is_negative(newValue) ); - const difference_type newRemainder( newValue % num_intraword_positions ); - - // calc data_ += newValue / num_intraword_positions; - // remainder_ = newRemainder; - // for newValue >= 0, and - // data_ += newValue / num_intraword_positions - 1; - // remainder_ = newRemainder + num_intraword_positions; - // (to force remainder_ to be positive). - // This is branch-free, if is_negative() is branch-free - data_ += newValue / num_intraword_positions - isNegative; - remainder_ = newRemainder + isNegative*num_intraword_positions; - update_mask(); - - return *this; - } - - PackedPixelRowIterator& operator-=( difference_type d ) - { - // forward to operator+= - which has to cope with negative - // values, anyway. - return *this += -d; - } - - PackedPixelRowIterator operator+( difference_type d ) - { - PackedPixelRowIterator res(*this); - res += d; - return res; - } - - PackedPixelRowIterator operator-( difference_type d ) - { - PackedPixelRowIterator res(*this); - res -= d; - return res; - } - - PackedPixelRowIterator& operator++() - { - inc(); - return *this; - } - - PackedPixelRowIterator& operator--() - { - dec(); - return *this; - } - - PackedPixelRowIterator operator++(int) - { - PackedPixelRowIterator res(*this); - inc(); - return res; - } - - PackedPixelRowIterator operator--(int) - { - PackedPixelRowIterator res(*this); - dec(); - return res; - } - - bool operator==(PackedPixelRowIterator const & rhs) const - { - return equal( rhs ); - } - - bool operator!=(PackedPixelRowIterator const & rhs) const - { - return !equal( rhs ); - } - - bool operator<(PackedPixelRowIterator const & rhs) const - { - return less(rhs); - } - - bool operator<=(PackedPixelRowIterator const & rhs) const - { - return !rhs.less(*this); - } - - bool operator>(PackedPixelRowIterator const & rhs) const - { - return rhs.less(*this); - } - - bool operator>=(PackedPixelRowIterator const & rhs) const - { - return !less(rhs); - } - - difference_type operator-(PackedPixelRowIterator const & rhs) const - { - return (data_ - rhs.data_)*num_intraword_positions + (remainder_ - rhs.remainder_); - } - - value_type get() const - { - return unsigned_cast<value_type>(*data_ & mask_) >> - get_shift<num_intraword_positions, - bits_per_pixel, - MsbFirst>(remainder_); - } - - value_type get(difference_type d) const - { - PackedPixelRowIterator tmp(*this); - tmp += d; - return tmp.get(); - } - - void set( value_type v ) const - { - const value_type pixel_value( - (v << - get_shift<num_intraword_positions, bits_per_pixel, MsbFirst>(remainder_)) - & mask_ ); - *data_ = (*data_ & ~mask_) | pixel_value; - } - - void set( value_type v, difference_type d ) const - { - PackedPixelRowIterator tmp(*this); - tmp += d; - tmp.set(v); - } -}; - -/** 2D image iterator for packed pixel formats - - This iterator can be used for image formats that pack more than - one pixel into an machine data type (like one bit per pixel, eight - of which packed into one char) - */ -template< typename Valuetype, - int bits_per_pixel, - bool MsbFirst > class PackedPixelIterator : public NonStandardIterator -{ -public: - // no reference, no index_reference type here - typedef Valuetype value_type; - typedef vigra::Diff2D difference_type; - typedef image_traverser_tag iterator_category; - typedef PackedPixelRowIterator<value_type, - bits_per_pixel, - MsbFirst> row_iterator; - typedef PackedPixelColumnIterator<value_type, - bits_per_pixel, - MsbFirst> column_iterator; - - typedef value_type* pointer; - typedef int MoveX; - typedef StridedArrayIterator< value_type > MoveY; - - enum { - /** The number of pixel within a single value_type value - */ - num_intraword_positions=sizeof(value_type)*8/bits_per_pixel, - /** Bit mask for one pixel (least significant bits) - */ - bit_mask=~(~0 << bits_per_pixel) - }; - - // TODO(F2): direction of iteration (ImageIterator can be made to - // run backwards) - -private: - pointer current() const - { - return y() + (x / num_intraword_positions); - } - - pointer current(int dx, int dy) const - { - return y(dy) + ((x+dx)/num_intraword_positions); - } - - bool equal(PackedPixelIterator const & rhs) const - { - return (x == rhs.x) && (y == rhs.y); - } - -public: - PackedPixelIterator() : - x(0), - y(0) - {} - - PackedPixelIterator(pointer base, int ystride) : - x(0), - y(ystride,base) - {} - - bool operator==(PackedPixelIterator const & rhs) const - { - return equal(rhs); - } - - bool operator!=(PackedPixelIterator const & rhs) const - { - return !equal(rhs); - } - - difference_type operator-(PackedPixelIterator const & rhs) const - { - return difference_type(x - rhs.x, y - rhs.y); - } - - MoveX x; - MoveY y; - - PackedPixelIterator & operator+=(difference_type const & s) - { - x += s.x; - y += s.y; - return *this; - } - - PackedPixelIterator & operator-=(difference_type const & s) - { - x -= s.x; - y -= s.y; - return *this; - } - - PackedPixelIterator operator+(difference_type const & s) const - { - PackedPixelIterator ret(*this); - ret += s; - return ret; - } - - PackedPixelIterator operator-(difference_type const & s) const - { - PackedPixelIterator ret(*this); - ret -= s; - return ret; - } - - row_iterator rowIterator() const - { - return row_iterator(current(),x); - } - - column_iterator columnIterator() const - { - return column_iterator(MoveY(y, - x / num_intraword_positions), - x % num_intraword_positions); - } - - value_type get() const - { - const int remainder( x % num_intraword_positions ); - - return (unsigned_cast<value_type>(*current() & - get_mask<value_type, bits_per_pixel, MsbFirst>(remainder)) - >> get_shift<num_intraword_positions, bits_per_pixel, MsbFirst>(remainder)); - } - - value_type get(difference_type const & d) const - { - const int remainder( x(d.x) % num_intraword_positions ); - - return (unsigned_cast<value_type>(*current(d.x,d.y) & - get_mask<value_type, bits_per_pixel, MsbFirst>(remainder)) - >> get_shift<num_intraword_positions, bits_per_pixel, MsbFirst>(remainder)); - } - - void set( value_type v ) const - { - const int remainder( x % num_intraword_positions ); - const int mask( get_mask<value_type, bits_per_pixel, MsbFirst>(remainder) ); - const value_type pixel_value( - (v << - get_shift<num_intraword_positions, bits_per_pixel, MsbFirst>(remainder)) - & mask ); - pointer p = current(); - *p = (*p & ~mask) | pixel_value; - } - - void set( value_type v, difference_type const & d ) const - { - const int remainder( (x + d.x) % num_intraword_positions ); - const int mask( get_mask<value_type, bits_per_pixel, MsbFirst>(remainder) ); - const value_type pixel_value( - (v << - get_shift<num_intraword_positions, bits_per_pixel, MsbFirst>(remainder)) - & mask ); - pointer p = current(d.x,d.y); - *p = (*p & ~mask) | pixel_value; - } -}; - -//----------------------------------------------------------------------------- - -// partial specialization for the accessor traits masked_accessor -// selector metafunction - can employ fast mask functor for the 1bpp -// case. -template< class Accessor, - class MaskAccessor, - class Iterator, - bool polarity, - bool MsbFirst > struct maskedAccessorSelector< Accessor, - MaskAccessor, - Iterator, - PackedPixelIterator< typename MaskAccessor::value_type, - 1, - MsbFirst >, - polarity > -{ - typedef TernarySetterFunctionAccessorAdapter< - Accessor, - MaskAccessor, - typename outputMaskFunctorSelector< - typename Accessor::value_type, - typename MaskAccessor::value_type, - polarity, - FastMask>::type > - type; -}; - -} // namespace basebmp - -#endif /* INCLUDED_BASEBMP_PACKEDPIXELITERATOR_HXX */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |