#pragma once
#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