blob: b219a265bf258f06497725d156ab56af69721856 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_BASEBMP_COLORBLENDACCESSORADAPTER_HXX
#define INCLUDED_BASEBMP_COLORBLENDACCESSORADAPTER_HXX
#include <basebmp/colortraits.hxx>
namespace basebmp
{
/** Accessor adapter that blends input value against fixed color value
Used to blend an alpha mask 'through' a fixed color value into the
destination.
The getter functors return a constant value (usually the zero of
the value type, this preserves the original destination content
when blitting through a mask) - there really isn't no other
sensible default behaviour for these methods.
*/
template< class WrappedAccessor,
typename AlphaType,
bool polarity > class ConstantColorBlendSetterAccessorAdapter
{
public:
typedef AlphaType alpha_type;
typedef AlphaType value_type;
typedef typename WrappedAccessor::value_type color_type;
private:
typename ColorTraits< color_type >::
template blend_functor<alpha_type,polarity>::type maFunctor;
WrappedAccessor maWrappee;
color_type maBlendColor;
value_type maGetterValue;
public:
ConstantColorBlendSetterAccessorAdapter() :
maFunctor(),
maWrappee(),
maBlendColor(),
maGetterValue()
{}
template< class T > explicit ConstantColorBlendSetterAccessorAdapter( T acc ) :
maFunctor(),
maWrappee(acc),
maBlendColor(),
maGetterValue()
{}
template< class T > ConstantColorBlendSetterAccessorAdapter( T acc,
color_type col ) :
maFunctor(),
maWrappee(acc),
maBlendColor(col),
maGetterValue()
{}
template< class T > ConstantColorBlendSetterAccessorAdapter( T acc,
color_type col,
value_type val ) :
maFunctor(),
maWrappee(acc),
maBlendColor(col),
maGetterValue(val)
{}
// -------------------------------------------------------
void setColor( color_type col ) { maBlendColor=col; }
color_type getColor() { return maBlendColor; }
void setGetterValue( value_type val ) { maGetterValue=val; }
value_type getGetterValue() { return maGetterValue; }
// -------------------------------------------------------
WrappedAccessor const& getWrappedAccessor() const { return maWrappee; }
WrappedAccessor& getWrappedAccessor() { return maWrappee; }
// -------------------------------------------------------
/// @return constant value, regardless of iterator content
template< typename IteratorType > value_type operator()(IteratorType const& ) const
{
return maGetterValue;
}
/// @return constant value, regardless of iterator content
template< typename IteratorType, class Difference >
value_type operator()(IteratorType const& , Difference const& ) const
{
return maGetterValue;
}
// -------------------------------------------------------
template< typename V, typename IteratorType >
void set(V const& value, IteratorType const& i) const
{
maWrappee.set(
maFunctor(
vigra::detail::RequiresExplicitCast<alpha_type>::cast(value),
maWrappee(i),
maBlendColor),
i );
}
template< typename V, typename IteratorType, class Difference >
void set(V const& value, IteratorType const& i, Difference const& diff) const
{
maWrappee.set(
maFunctor(
vigra::detail::RequiresExplicitCast<alpha_type>::cast(value),
maWrappee(i,diff),
maBlendColor),
i,
diff );
}
};
} // namespace basebmp
#endif /* INCLUDED_BASEBMP_COLORBLENDACCESSORADAPTER_HXX */