Blob Blame Raw
#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