Hi Nathan,
Output with trunk:
Value: 12632255
Should be: 1073741823
There was already a bug in the code before I patched it. Basically the
static_cast to integer_t should have been applied to src only.
Please review my patch. The function is more verbose now but I thing
it's more clear.
Index: channel_algorithm.hpp
===================================================================
--- channel_algorithm.hpp (revision 66416)
+++ channel_algorithm.hpp (working copy)
@@ -226,8 +226,20 @@
template
struct channel_converter_unsigned_integral_nondivisible
{
DstChannelV operator()(SrcChannelV src) const {
- typedef typename base_channel_type<DstChannelV>::type dest_t;
- return DstChannelV(static_cast( src *
unsigned_integral_max_value<DstChannelV>::value) /
unsigned_integral_max_value<SrcChannelV>::value);
+
+ // make sure the operation below doesn't overflow dst's
integeral data type.
+ // e.g. dst is 30bit and src is 8 bit can result in 38bit value
+ typedef typename detail::min_fast_uint<
unsigned_integral_num_bits< SrcChannelV >::value
+ +
unsigned_integral_num_bits< DstChannelV >::value
+ >::type integer_t;
+
+ typedef typename base_channel_type< DstChannelV >::type dest_t;
+
+ integer_t src_ = static_cast< integer_t >( src );
+ integer_t dst_max = unsigned_integral_max_value<DstChannelV>::value;
+ integer_t src_max = unsigned_integral_max_value<SrcChannelV>::value;
+
+ return static_cast< dest_t >( src_ * dst_max / src_max );
}
};
Regards,
Christian