////////////////////////////////////////////////////////////////////////////////
//  CQ出版社 インターフェース 2008年7月号
//
//  初音ミク（はちゅねみく）・アニメーション
//  画像変換ツール	Copyright(c)2008 Sumio Morioka
//  morioka@fb3.so-net.ne.jp,  http://www002.upp.so-net.ne.jp/morioka/
//
//  本プログラムコードの商業利用，および改変ファイルの二次配布を禁じます．それ以外の
//  利用はとくに制限しませんが，利用によって生じた被害・不利益などに対しては，一切
//  責任を負いませんのでご了承ください．
//
//  また，本プログラムのサンプルとして同梱される初音ミク，はちゅねミク，鏡音リン・レンの
//  画像（フォント・データも含む）は，クリプトン・フューチャー・メディア株式会社
// （http://www.crypton.co.jp）の著作物です．商業利用等については同社へ問い合わせてください．
//
//
// History:
// 1. Original coding by Sumio Morioka, 2008/04/18
//
////////////////////////////////////////////////////////////////////////////////

#ifndef	BMP2FRFONT_MAIN_H
#define	BMP2FRFONT_MAIN_H


#define	DIST_H_SCALE	10.0f
#define	DIST_S_SCALE	1.0f
#define	DIST_V_SCALE	50.0f


///////////////////////////////////////////////////////////
// macros (don't touch)
///////////////////////////////////////////////////////////

#define	dist(x, y)			((x) >= (y) ? ((x) - (y)) : ((y) - (x)))
#define	color_num(r, g, b)	( (((r) & 7) << 6) + (((g) & 7) << 3) + (((b) & 7) << 0) )

#define	mat_val(ptr, x, y, x_size, y_size)		*((ptr) + ((y) * (x_size) + (x)))	// (NOT MATLAB)
//#define	mat_val(ptr, x, y, x_size, y_size)	*((ptr) + ((x) * (y_size) + (y)))	// (MATLAB)

#define	bmp_rval(bitmaplist, frame, x, y)		*(((bitmaplist)->bmp_data) + (((frame) - 1) * ((bitmaplist)->width) * ((bitmaplist)->height) * 3) + (((bitmaplist)->width) * (y) * 3) + ((x) * 3))
#define	bmp_gval(bitmaplist, frame, x, y)		*(((bitmaplist)->bmp_data) + (((frame) - 1) * ((bitmaplist)->width) * ((bitmaplist)->height) * 3) + (((bitmaplist)->width) * (y) * 3) + ((x) * 3) + 1)
#define	bmp_bval(bitmaplist, frame, x, y)		*(((bitmaplist)->bmp_data) + (((frame) - 1) * ((bitmaplist)->width) * ((bitmaplist)->height) * 3) + (((bitmaplist)->width) * (y) * 3) + ((x) * 3) + 2)

#define	PALETTE_ENTRY		16
#define	PALETTE_COLOR		3		// (R,G,B)

#define	PI					3.1415926535f

///////////////////////////////////////////////////////////
// typedef
///////////////////////////////////////////////////////////
#define	uint8	unsigned char

typedef struct _bmp2FRfont_data {
	// bitmap data
	unsigned int	width;
	unsigned int	height;
	uint8			*bmp_data;

	// histgram
	uint8			hist[PALETTE_ENTRY][PALETTE_COLOR + 1];

	// palette data
	uint8			plt_data_RGB[PALETTE_ENTRY][PALETTE_COLOR + 1];			// (r:g:b:ena)
	uint8			plt_data_HSV[PALETTE_ENTRY][PALETTE_COLOR + 1];			// (r:g:b:ena)
	double			plt_data_HSV_coodinate[PALETTE_ENTRY][PALETTE_COLOR];	// (x:y:z)

	// converted data
	uint8			*rdata;
	uint8			*gdata;
	uint8			*bdata;
	uint8			*plt_map;
} BMP2FRFONT_DATA;

///////////////////////////////////////////////////////////
// global
///////////////////////////////////////////////////////////

extern uint8	bmp2FRfont_GLBL_plt_org_data[PALETTE_ENTRY][PALETTE_COLOR + 1];

///////////////////////////////////////////////////////////
// prototype
///////////////////////////////////////////////////////////

extern void		bmp2FRfont_initdata(BMP2FRFONT_DATA *);
extern void		bmp2FRfont_cleardata(BMP2FRFONT_DATA *);
extern int		bmp2FRfont_v8to3(int);
extern void		bmp2FRfont_get_histogram(BMP2FRFONT_DATA *);
extern double	bmp2FRfont_hsv_distance(uint8, uint8, uint8, uint8, uint8, uint8);
extern void		bmp2FRfont_hsv_location(uint8, uint8, uint8, double *, double *, double *);
extern double	bmp2FRfont_hsv_distance_from_loc(double, double, double, double, double, double);
extern void		bmp2FRfont_rgb2hsv(const uint8, const uint8, const uint8, uint8 *, uint8 *, uint8 *);
extern void		bmp2FRfont_hsv2rgb(const uint8, const uint8, const uint8, uint8 *, uint8 *, uint8 *);
extern void		bmp2FRfont_calc_gaussian_hsv(const uint8*, const uint8*, const uint8*, const int, const int, const int, const int, uint8 *, uint8 *, uint8 *);
extern void		bmp2FRfont_reduce_color(BMP2FRFONT_DATA *, int, uint8, uint8, uint8, int);
extern int		bmp2FRfont_read24bitBMP(const char *, BMP2FRFONT_DATA *);
extern int		bmp2FRfont_write24bitBMP(const char *, BMP2FRFONT_DATA *, int);
extern void		bmp2FRfont_write_palette_C(char *, BMP2FRFONT_DATA *);
extern void		bmp2FRfont_write_palette_PAL(char *, BMP2FRFONT_DATA *);
extern void		bmp2FRfont_write_flash_hex(char *, int, int, int, int, int, int, BMP2FRFONT_DATA *);

#endif	// BMP2FRFONT_MAIN_H
// end of file
