Re: [Boost-bugs] [Boost C++ Libraries] #2211: Can not create image of Regular type

Subject: Re: [Boost-bugs] [Boost C++ Libraries] #2211: Can not create image of Regular type
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2008-08-18 10:42:35

#2211: Can not create image of Regular type
  Reporter: john.femiani_at_[hidden] | Owner: hljin
      Type: Bugs | Status: new
 Milestone: Boost 1.36.0 | Component: GIL
   Version: Boost 1.36.0 | Severity: Problem
Resolution: | Keywords:

Comment(by john.femiani_at_[hidden]):

 The issue is twofold:

  1. A regular type (like a single-chennel pixel) can be considered planer
 or interleaved. When the image type is planar, GIL tends to use the
 `num_channels` metafunction (valid only for !PixelBased), so it is easier
 just to say Regular types are '''not''' planar.

  2. The `is_planar` metafunction had no default value. I think it is safe
 to say that the `is_planar` metafunction is short for `is_planar_pixel`,
 and so if the type is not a pixel it should return `false_`. In fact, I
 think it is reasonable to let it have a default value of `false_`.

  3. Some of the code first checks if the image is planar and then uses
 !PixelBased operations if it is planar, but the code was laid out so that
 both branches of the `if (!IsPLanar)` condition had to compiles. I
 reorganized that code slightly.

 Since I have had bad luck attaching patches on this Trac site (Trac thinks
 they ar spam!), the patch that made my test compile is attached (no clue
 if I broke anything else, I just have the headers here).

 Index: image.hpp
 --- image.hpp (revision 48190)
 +++ image.hpp (working copy)
 @@ -193,14 +193,25 @@
          if (_memory) _alloc.deallocate(_memory,

 + struct _channels_in_image :
 + mpl::eval_if<is_pixel<value_type>,
 + num_channels<view_t>,
 + mpl::int_<1>
 + >::type
 + {};
      std::size_t total_allocated_size_in_bytes(const point_t& dimensions)
 const {
          std::size_t size_in_units =
 - if (IsPlanar)
 - size_in_units =

 + typedef typename view_t::x_iterator x_iterator;
 + if (IsPlanar)
 + size_in_units =
          // return the size rounded up to the nearest byte
 - return (size_in_units + byte_to_memunit<typename
 view_t::x_iterator>::value - 1) / byte_to_memunit<typename
 - + (_align_in_bytes>0 ? _align_in_bytes-1:0); //
 add extra padding in case we need to align the first image pixel
 + return (size_in_units + byte_to_memunit<x_iterator>::value - 1) /
 + + (_align_in_bytes>0 ? _align_in_bytes-1:0);
 + // add extra padding in case we need to align the first image

      std::size_t get_row_size_in_memunits(x_coord_t width) const { //
 number of units per row
 Index: pixel.hpp
 --- pixel.hpp (revision 48190)
 +++ pixel.hpp (working copy)
 @@ -42,7 +42,7 @@
  template <typename PixelBased> struct color_space_type;
  template <typename PixelBased> struct channel_mapping_type;
  template <typename PixelBased> struct channel_type;
 -template <typename PixelBased> struct is_planar;
 +template <typename PixelBased> struct is_planar : mpl::false_{}; //False
 by default

  template <typename PixelBased> struct color_space_type<const PixelBased>
 : public color_space_type<PixelBased> {};
  template <typename PixelBased> struct channel_mapping_type<const
 PixelBased> : public channel_mapping_type<PixelBased> {};

Ticket URL: <>
Boost C++ Libraries <>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:49:58 UTC