|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef TCG_PIXEL_OPS_H
|
|
Toshihiro Shimizu |
890ddd |
#define TCG_PIXEL_OPS_H
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// tcg includes
|
|
Toshihiro Shimizu |
890ddd |
#include "base.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace tcg {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Pixel Categories
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
struct grayscale_pixel_tag {};
|
|
Shinya Kitaoka |
120a6e |
struct rgb_pixel_tag {};
|
|
Shinya Kitaoka |
120a6e |
struct rgbm_pixel_tag : public rgb_pixel_tag {};
|
|
Shinya Kitaoka |
120a6e |
struct indexed_pixel_tag {};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Pixel Traits Types
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename pixel_category = typename Pix::pixel_category>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits_types;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits_types<Pix, grayscale_pixel_tag> {
|
|
Shinya Kitaoka |
120a6e |
typedef Pix pixel_type;
|
|
Shinya Kitaoka |
120a6e |
typedef grayscale_pixel_tag pixel_category;
|
|
Shinya Kitaoka |
120a6e |
typedef typename Pix::channel_type channel_type;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
enum { channels_count = 1 };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits_types<Pix, rgb_pixel_tag> {
|
|
Shinya Kitaoka |
120a6e |
typedef Pix pixel_type;
|
|
Shinya Kitaoka |
120a6e |
typedef rgb_pixel_tag pixel_category;
|
|
Shinya Kitaoka |
120a6e |
typedef typename Pix::channel_type channel_type;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
enum { channels_count = 3 };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits_types<Pix, rgbm_pixel_tag>
|
|
Shinya Kitaoka |
120a6e |
: public pixel_traits_types<Pix, rgb_pixel_tag> {
|
|
Shinya Kitaoka |
120a6e |
typedef Pix pixel_type;
|
|
Shinya Kitaoka |
120a6e |
typedef rgbm_pixel_tag pixel_category;
|
|
Shinya Kitaoka |
120a6e |
typedef typename Pix::channel_type channel_type;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
enum { channels_count = 4 };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits_types<Pix, indexed_pixel_tag> {
|
|
Shinya Kitaoka |
120a6e |
typedef Pix pixel_type;
|
|
Shinya Kitaoka |
120a6e |
typedef indexed_pixel_tag pixel_category;
|
|
Shinya Kitaoka |
120a6e |
typedef typename Pix::index_type index_type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Pixel Traits
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename pixel_category = typename Pix::pixel_category>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits<Pix, grayscale_pixel_tag>
|
|
Shinya Kitaoka |
120a6e |
: public pixel_traits_types<Pix, grayscale_pixel_tag> {
|
|
Shinya Kitaoka |
120a6e |
typedef pixel_traits_types<Pix, grayscale_pixel_tag> tr;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type max_channel_value();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type l(const typename tr::pixel_type &pix);
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type &l(typename tr::pixel_type &pix);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits<Pix, rgb_pixel_tag> {
|
|
Shinya Kitaoka |
120a6e |
typedef pixel_traits_types<Pix, rgb_pixel_tag> tr;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type max_channel_value();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type r(const typename tr::pixel_type &pix);
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type &r(typename tr::pixel_type &pix);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type g(const typename tr::pixel_type &pix);
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type &g(typename tr::pixel_type &pix);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type b(const typename tr::pixel_type &pix);
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type &b(typename tr::pixel_type &pix);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix>
|
|
Shinya Kitaoka |
120a6e |
struct pixel_traits<Pix, rgbm_pixel_tag>
|
|
Shinya Kitaoka |
120a6e |
: public pixel_traits<Pix, rgb_pixel_tag> {
|
|
Shinya Kitaoka |
120a6e |
typedef pixel_traits_types<Pix, rgbm_pixel_tag> tr;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type m(const typename tr::pixel_type &pix);
|
|
Shinya Kitaoka |
120a6e |
static typename tr::channel_type &m(typename tr::pixel_type &pix);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix>
|
|
Toshihiro Shimizu |
890ddd |
struct pixel_traits<Pix, indexed_pixel_tag> {
|
|
Shinya Kitaoka |
120a6e |
typedef pixel_traits_types<Pix, indexed_pixel_tag> tr;
|
|
Shinya Kitaoka |
120a6e |
typedef typename tr::pixel_type pixel_type;
|
|
Shinya Kitaoka |
120a6e |
typedef typename tr::index_type index_type;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
static typename tr::index_type index(const typename tr::pixel_type &pix);
|
|
Shinya Kitaoka |
120a6e |
static typename tr::index_type &index(typename tr::pixel_type &pix);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace pixel_ops {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Pixel Functions
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename PixIn, typename PixOut>
|
|
Shinya Kitaoka |
120a6e |
inline PixOut _cast(const PixIn &pix, grayscale_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return PixOut(pixel_traits<PixIn>::l(pix));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename PixIn, typename PixOut>
|
|
Shinya Kitaoka |
120a6e |
inline PixOut _cast(const PixIn &pix, rgb_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return PixOut(pixel_traits<PixIn>::r(pix), pixel_traits<PixIn>::g(pix),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixIn>::b(pix));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename PixIn, typename PixOut>
|
|
Shinya Kitaoka |
120a6e |
inline PixOut _cast(const PixIn &pix, rgbm_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return PixOut(pixel_traits<PixIn>::r(pix), pixel_traits<PixIn>::g(pix),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixIn>::b(pix), pixel_traits<PixIn>::m(pix));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename PixIn, typename PixOut>
|
|
Shinya Kitaoka |
120a6e |
inline PixOut cast(const PixIn &pix) {
|
|
Shinya Kitaoka |
120a6e |
return _cast<PixIn, PixOut>(pix,
|
|
Shinya Kitaoka |
120a6e |
typename pixel_traits<PixIn>::pixel_category());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename PixIn, typename PixOut>
|
|
Shinya Kitaoka |
120a6e |
inline void _assign(PixOut &pixout, const PixIn &pixin, grayscale_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixOut>::l(pixout) = pixel_traits<PixIn>::l(pixin);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename PixIn, typename PixOut>
|
|
Shinya Kitaoka |
120a6e |
inline void _assign(PixOut &pixout, const PixIn &pixin, rgb_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixOut>::r(pixout) = pixel_traits<PixIn>::r(pixin);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixOut>::g(pixout) = pixel_traits<PixIn>::g(pixin);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixOut>::b(pixout) = pixel_traits<PixIn>::b(pixin);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename PixIn, typename PixOut>
|
|
Shinya Kitaoka |
120a6e |
inline void _assign(PixOut &pixout, const PixIn &pixin, rgbm_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixOut>::r(pixout) = pixel_traits<PixIn>::r(pixin);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixOut>::g(pixout) = pixel_traits<PixIn>::g(pixin);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixOut>::b(pixout) = pixel_traits<PixIn>::b(pixin);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<PixOut>::m(pixout) = pixel_traits<PixIn>::m(pixin);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename PixIn, typename PixOut>
|
|
Shinya Kitaoka |
120a6e |
inline void assign(PixOut &pixout, const PixIn &pixin) {
|
|
Shinya Kitaoka |
120a6e |
_assign<PixIn, PixOut>(pixout, pixin,
|
|
Shinya Kitaoka |
120a6e |
typename pixel_traits<PixIn>::pixel_category());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix1, typename Pix2>
|
|
Shinya Kitaoka |
120a6e |
inline Pix1 _sum(const Pix1 &a, const Pix2 &b, grayscale_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix1(pixel_traits<Pix1>::l(a) + pixel_traits<Pix2>::l(b));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix1, typename Pix2>
|
|
Shinya Kitaoka |
120a6e |
inline Pix1 _sum(const Pix1 &a, const Pix2 &b, rgb_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix1(pixel_traits<Pix1>::r(a) + pixel_traits<Pix2>::r(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::g(a) + pixel_traits<Pix2>::g(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::b(a) + pixel_traits<Pix2>::b(b));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix1, typename Pix2>
|
|
Shinya Kitaoka |
120a6e |
inline Pix1 _sum(const Pix1 &a, const Pix2 &b, rgbm_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix1(pixel_traits<Pix1>::r(a) + pixel_traits<Pix2>::r(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::g(a) + pixel_traits<Pix2>::g(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::b(a) + pixel_traits<Pix2>::b(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::m(a) + pixel_traits<Pix2>::m(b));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix1, typename Pix2>
|
|
Shinya Kitaoka |
120a6e |
inline Pix1 operator+(const Pix1 &a, const Pix2 &b) {
|
|
Shinya Kitaoka |
120a6e |
return _sum(a, b, typename pixel_traits<Pix2>::pixel_category());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix1, typename Pix2>
|
|
Shinya Kitaoka |
120a6e |
inline Pix1 _sub(const Pix1 &a, const Pix2 &b, grayscale_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix1(pixel_traits<Pix1>::l(a) - pixel_traits<Pix2>::l(b));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix1, typename Pix2>
|
|
Shinya Kitaoka |
120a6e |
inline Pix1 _sub(const Pix1 &a, const Pix2 &b, rgb_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix1(pixel_traits<Pix1>::r(a) - pixel_traits<Pix2>::r(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::g(a) - pixel_traits<Pix2>::g(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::b(a) - pixel_traits<Pix2>::b(b));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix1, typename Pix2>
|
|
Shinya Kitaoka |
120a6e |
inline Pix1 _sub(const Pix1 &a, const Pix2 &b, rgbm_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix1(pixel_traits<Pix1>::r(a) - pixel_traits<Pix2>::r(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::g(a) - pixel_traits<Pix2>::g(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::b(a) - pixel_traits<Pix2>::b(b),
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix1>::m(a) - pixel_traits<Pix2>::m(b));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix1, typename Pix2>
|
|
Shinya Kitaoka |
120a6e |
inline Pix1 operator-(const Pix1 &a, const Pix2 &b) {
|
|
Shinya Kitaoka |
120a6e |
return _sub(a, b, typename pixel_traits<Pix2>::pixel_category());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _mult(const Pix &a, Scalar k, grayscale_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix(pixel_traits<Pix>::l(a) * k);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _mult(const Pix &a, Scalar k, rgb_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix(pixel_traits<Pix>::r(a) * k, pixel_traits<Pix>::g(a) * k,
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(a) * k);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _mult(const Pix &a, Scalar k, rgbm_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix(pixel_traits<Pix>::r(a) * k, pixel_traits<Pix>::g(a) * k,
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(a) * k, pixel_traits<Pix>::m(a) * k);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix operator*(Scalar k, const Pix &pix) {
|
|
Shinya Kitaoka |
120a6e |
return _mult(pix, k, typename pixel_traits<Pix>::pixel_category());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _div(const Pix &a, Scalar k, grayscale_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix(pixel_traits<Pix>::l(a) / k);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _div(const Pix &a, Scalar k, rgb_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix(pixel_traits<Pix>::r(a) / k, pixel_traits<Pix>::g(a) / k,
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(a) / k);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _div(const Pix &a, Scalar k, rgbm_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix(pixel_traits<Pix>::r(a) / k, pixel_traits<Pix>::g(a) / k,
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(a) / k, pixel_traits<Pix>::m(a) / k);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix operator/(const Pix &pix, Scalar k) {
|
|
Shinya Kitaoka |
120a6e |
return _div(pix, k, typename pixel_traits<Pix>::pixel_category());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline void premultiply(Pix &pix, Scalar = 0) {
|
|
Shinya Kitaoka |
120a6e |
Scalar factor =
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::m(pix) / Scalar(pixel_traits<Pix>::max_channel_value);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::r(pix) = pixel_traits<Pix>::r(pix) * factor;
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::g(pix) = pixel_traits<Pix>::g(pix) * factor;
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(pix) = pixel_traits<Pix>::b(pix) * factor;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline void depremultiply(Pix &pix, Scalar = 0) {
|
|
Shinya Kitaoka |
120a6e |
if (pixel_traits<Pix>::channel_type m = pixel_traits<Pix>::m(pix)) {
|
|
Shinya Kitaoka |
120a6e |
Scalar factor = pixel_traits<Pix>::max_channel_value / Scalar(m);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::r(pix) = pixel_traits<Pix>::r(pix) * factor;
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::g(pix) = pixel_traits<Pix>::g(pix) * factor;
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(pix) = pixel_traits<Pix>::b(pix) * factor;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _blend(const Pix &p0, const Pix &p1, Scalar t, grayscale_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
return Pix((1 - t) * pixel_traits<Pix>::l(p0) + t * pixel_traits<Pix>::l(p1));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _blend(const Pix &p0, const Pix &p1, Scalar t, rgb_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
Scalar one_t = 1 - t;
|
|
Shinya Kitaoka |
120a6e |
return Pix(one_t * pixel_traits<Pix>::r(p0) + t * pixel_traits<Pix>::r(p1),
|
|
Shinya Kitaoka |
120a6e |
one_t * pixel_traits<Pix>::g(p0) + t * pixel_traits<Pix>::g(p1),
|
|
Shinya Kitaoka |
120a6e |
one_t * pixel_traits<Pix>::m(p0) + t * pixel_traits<Pix>::b(p1));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix _blend(const Pix &p0, const Pix &p1, Scalar t, rgbm_pixel_tag) {
|
|
Shinya Kitaoka |
120a6e |
Scalar one_t = 1 - t;
|
|
Shinya Kitaoka |
120a6e |
return Pix(one_t * pixel_traits<Pix>::r(p0) + t * pixel_traits<Pix>::r(p1),
|
|
Shinya Kitaoka |
120a6e |
one_t * pixel_traits<Pix>::g(p0) + t * pixel_traits<Pix>::g(p1),
|
|
Shinya Kitaoka |
120a6e |
one_t * pixel_traits<Pix>::b(p0) + t * pixel_traits<Pix>::b(p1),
|
|
Shinya Kitaoka |
120a6e |
one_t * pixel_traits<Pix>::m(p0) + t * pixel_traits<Pix>::m(p1));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline Pix blend(const Pix &p0, const Pix &p1, Scalar t) {
|
|
Shinya Kitaoka |
120a6e |
return _blend(p0, p1, t, pixel_traits<Pix>::pixel_category());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline void over_premult(Pix &down, const Pix &up, Scalar = 0) {
|
|
Shinya Kitaoka |
120a6e |
Scalar t =
|
|
Shinya Kitaoka |
120a6e |
(1 -
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::m(up) / Scalar(pixel_traits<Pix>::max_channel_value));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::r(down) =
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::r(up) + t * pixel_traits<Pix>::r(down);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::g(down) =
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::g(up) + t * pixel_traits<Pix>::g(down);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(down) =
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(up) + t * pixel_traits<Pix>::b(down);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::m(down) =
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::m(up) + t * pixel_traits<Pix>::m(down);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename Pix, typename Scalar>
|
|
Shinya Kitaoka |
120a6e |
inline void over(Pix &down, const Pix &up, Scalar = 0) {
|
|
Shinya Kitaoka |
120a6e |
Scalar t = (1 -
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::m(up) /
|
|
Shinya Kitaoka |
120a6e |
Scalar(pixel_traits<Pix>::max_channel_value)) *
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::m(down);
|
|
Shinya Kitaoka |
120a6e |
Scalar m = pixel_traits<Pix>::m(up) + t;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
Scalar up_fac = pixel_traits<Pix>::m(up) / m;
|
|
Shinya Kitaoka |
120a6e |
Scalar dn_fac = t / m;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::r(down) =
|
|
Shinya Kitaoka |
120a6e |
up_fac * pixel_traits<Pix>::r(up) + dn_fac * pixel_traits<Pix>::r(down);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::g(down) =
|
|
Shinya Kitaoka |
120a6e |
up_fac * pixel_traits<Pix>::g(up) + dn_fac * pixel_traits<Pix>::g(down);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::b(down) =
|
|
Shinya Kitaoka |
120a6e |
up_fac * pixel_traits<Pix>::b(up) + dn_fac * pixel_traits<Pix>::b(down);
|
|
Shinya Kitaoka |
120a6e |
pixel_traits<Pix>::m(down) = m;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Shinya Kitaoka |
120a6e |
} // namespace tcg::pixel_ops
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
#endif // TCG_PIXEL_OPS_H
|