Blob Blame Raw
#pragma once

#ifndef igs_motion_wind_pixel_h
#define igs_motion_wind_pixel_h

#include <vector>
#include "igs_math_random.h"
#include "igs_ifx_common.h" /* igs::image::rgba::siz */

#ifndef IGS_MOTION_WIND_EXPORT
#define IGS_MOTION_WIND_EXPORT
#endif

namespace igs
{
namespace motion_wind
{
class IGS_MOTION_WIND_EXPORT pixel
{
public:
	pixel(
		const bool blow_dark_sw, const bool blow_alpha_sw

		,
		const unsigned long length_random_seed, const double length_min, const double length_max, const double length_bias, const bool length_ref_sw

		,
		const unsigned long force_random_seed, const double force_min, const double force_max, const double force_bias, const bool force_ref_sw

		,
		const unsigned long density_random_seed, const double density_min, const double density_max, const double density_bias, const bool density_ref_sw);

	int change(
		const bool key_reset_sw
		/***, const int ref_channel
	, const double *ref_pixel***/ /* ゼロなら参照しない */
		,
		const double ref_val /* ゼロ以上なら有効値、マイナスなら無効 */
		,
		const int channels, double *pixel_tgt);
	void clear(void);

private:
	std::vector<double> table_; /* 減少テーブル */

	igs::math::random length_random_;  // default seed is 1
	igs::math::random force_random_;   // default seed is 1
	igs::math::random density_random_; // default seed is 1

	const bool blow_dark_sw_,
		blow_alpha_sw_;

	/* ref全体をセットするか否かは、参照画像があるかない(NULL)かで決める */
	const double length_min_,
		length_max_;
	const double length_bias_;
	const bool length_ref_sw_;

	const double force_min_,
		force_max_;
	const double force_bias_;
	const bool force_ref_sw_;

	const double density_min_,
		density_max_;
	const double density_bias_;
	const bool density_ref_sw_;

	double key_lightness_;
	double pixel_key_[igs::image::rgba::siz];
	long table_len_,
		table_pos_;
	double *table_array_;

	/* copy constructorを無効化 */
	pixel(const pixel &);

	/* 代入演算子を無効化 */
	pixel &operator=(const pixel &);
};
}
}

#endif /* !igs_motion_wind_pixel_h */