130 lines
3.4 KiB
C++
130 lines
3.4 KiB
C++
|
|
|
|
#ifndef PIXEL_SELECTORS_H
|
|
#define PIXEL_SELECTORS_H
|
|
|
|
#include "tpixel.h"
|
|
#include "tpixelgr.h"
|
|
#include "tpixelcm.h"
|
|
|
|
namespace TRop
|
|
{
|
|
namespace borders
|
|
{
|
|
|
|
//****************************************************************
|
|
// Standard Pixel Selectors
|
|
//****************************************************************
|
|
|
|
template <typename Pix>
|
|
class PixelSelector
|
|
{
|
|
bool m_skip;
|
|
|
|
public:
|
|
typedef Pix pixel_type;
|
|
typedef Pix value_type;
|
|
|
|
public:
|
|
PixelSelector(bool onlyCorners = true)
|
|
: m_skip(onlyCorners) {}
|
|
|
|
value_type transparent() const { return pixel_type::Transparent; }
|
|
bool transparent(const pixel_type &pix) const { return (pix.m == 0); }
|
|
|
|
value_type value(const pixel_type &pix) const { return pix; }
|
|
bool equal(const pixel_type &a, const pixel_type &b) const { return a == b; }
|
|
|
|
void setSkip(bool skip) { m_skip = skip; }
|
|
bool skip(const value_type &prevLeftValue, const value_type &leftValue) const { return m_skip; }
|
|
};
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
template <>
|
|
class PixelSelector<TPixelGR8>
|
|
{
|
|
bool m_skip;
|
|
TPixelGR8 m_transpColor;
|
|
|
|
public:
|
|
typedef TPixelGR8 pixel_type;
|
|
typedef TPixelGR8 value_type;
|
|
|
|
public:
|
|
PixelSelector(bool onlyCorners = true,
|
|
pixel_type transparentColor = pixel_type::White)
|
|
: m_skip(onlyCorners), m_transpColor(transparentColor) {}
|
|
|
|
value_type transparent() const { return m_transpColor; }
|
|
bool transparent(const pixel_type &pix) const { return (pix == m_transpColor); }
|
|
|
|
value_type value(const pixel_type &pix) const { return pix; }
|
|
bool equal(const pixel_type &a, const pixel_type &b) const { return a == b; }
|
|
|
|
void setSkip(bool skip) { m_skip = skip; }
|
|
bool skip(const value_type &prevLeftValue, const value_type &leftValue) const { return m_skip; }
|
|
};
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
template <>
|
|
class PixelSelector<TPixelGR16>
|
|
{
|
|
bool m_skip;
|
|
TPixelGR16 m_transpColor;
|
|
|
|
public:
|
|
typedef TPixelGR16 pixel_type;
|
|
typedef TPixelGR16 value_type;
|
|
|
|
public:
|
|
PixelSelector(bool onlyCorners = true,
|
|
pixel_type transparentColor = pixel_type::White)
|
|
: m_skip(onlyCorners), m_transpColor(transparentColor) {}
|
|
|
|
value_type transparent() const { return m_transpColor; }
|
|
bool transparent(const pixel_type &pix) const { return (pix == m_transpColor); }
|
|
|
|
value_type value(const pixel_type &pix) const { return pix; }
|
|
bool equal(const pixel_type &a, const pixel_type &b) const { return a == b; }
|
|
|
|
void setSkip(bool skip) { m_skip = skip; }
|
|
bool skip(const value_type &prevLeftValue, const value_type &leftValue) const { return m_skip; }
|
|
};
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
template <>
|
|
class PixelSelector<TPixelCM32>
|
|
{
|
|
int m_tone;
|
|
bool m_skip;
|
|
|
|
public:
|
|
typedef TPixelCM32 pixel_type;
|
|
typedef TUINT32 value_type;
|
|
|
|
public:
|
|
PixelSelector(bool onlyCorners = true, int tone = 128)
|
|
: m_tone(tone), m_skip(onlyCorners) {}
|
|
|
|
value_type transparent() const { return 0; }
|
|
bool transparent(const pixel_type &pix) const { return value(pix) == 0; }
|
|
|
|
value_type value(const pixel_type &pix) const
|
|
{
|
|
return (pix.getTone() < m_tone) ? pix.getInk() : pix.getPaint();
|
|
}
|
|
bool equal(const pixel_type &a, const pixel_type &b) const
|
|
{
|
|
return value(a) == value(b);
|
|
}
|
|
|
|
void setSkip(bool skip) { m_skip = skip; }
|
|
bool skip(const value_type &prevLeftValue, const value_type &leftValue) const { return m_skip; }
|
|
};
|
|
}
|
|
} //namespace TRop::borders
|
|
|
|
#endif //PIXEL_SELECTORS_H
|