Boost logo

Boost :

From: Lubomir Bourdev (lbourdev_at_[hidden])
Date: 2006-10-06 22:06:40


Stefan Seefeld wrote:
>...IPP provides a heterogenous 16-bit RGB type with 5 bits red, 6 bits green,
>and 5 bits blue. I wonder whether that could be mapped to GIL, and how.

Although we don't have an existing model, I believe it is possible.
 
You will need to make a heterogeneous pixel (i.e. pixel whose channels are of different type). Its channels will have proxy references.
 
Here is how I would go about doing it.
First, you need a class that can modify a given range of bits in a given type. This will be the channel proxy reference:
// Manipulates bits [StartBit..StartBit+NumBits] of Data

template <typename Data, int StartBit, int NumBits>

struct subbyte_channel_reference {

    Data& _data;

    typedef Data value_type;

    subbyte_channel_reference(Data& data);

    subbyte_channel_reference& operator=(int value);

};

 

typedef subbyte_channel_reference<int16_t,0,5> red_565_chan_ref_t;

typedef subbyte_channel_reference<int16_t,6,6> green_565_chan_ref_t;

typedef subbyte_channel_reference<int16_t,11,5> blue_565_chan_ref_t;

 

You need to also make traits for it indicating that its reference type is proxy:

 

template <>

struct channel_traits<red_565_chan_ref_t> {

    typedef red_565_chan_ref_t::value_type value_type;

    typedef red_565_chan_ref_t reference;

    ...

};

 

Then create your own model of HeterogeneousPixelConcept that returns the corresponding references:
 
struct rgb565_pixel {

    typedef rgb_t color_space_t;

    template <int K> struct kth_channel_t;

    template <int K> typename kth_channel_t<K>::reference channel() {

        return typename kth_channel_t<K>::reference(_data);

    }

    int16_t _data; // this stores the 5+6+5 bits

};

 

template <> struct rgb565_pixel::kth_channel_t<0> {

    typedef red_565_chan_ref_t reference;

};

template <> struct rgb565_pixel::kth_channel_t<1> {

    typedef green_565_chan_ref_t reference;

};

template <> struct rgb565_pixel::kth_channel_t<2> {

    typedef blue_565_chan_ref_t reference;

};

 

 
You don't have to worry about planar representation here, as 565 pixels are always interleaved as far as I know.
 
In theory GIL shouldn't have to change.
"In theory, theory and practice are the same, but in practice..." :-)
I suspect there will be a few glitches since this will be the first such model.
 
Lubomir
 




Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk