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