/*	
 *	clipvqtc.h
 *
 *	VQ圧縮テクスチャ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Mon Dec 19 21:58:37 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	  まずは検証のために、Windows上でGDI+を使っての、圧縮展開ルーチンを作成しました。
 *	  dpbmpcnv.exeへの組み込みや、P/ECE用の描画ルーチンは、このあと作成する予定です。	⇒{{2016/12/22コメント追記:dpbmpcnv.exeへの組み込み,及び,P/ECE用の描画ルーチン(framvqtd.c)を作成しました。}}
 *	* Tue Dec 20 21:28:56 JST 2016 Naoyuki Sawa
 *	- k-means法(,又は,k-means++法)の繰り返し処理の、打ち切り条件を変更しました。
 *	  詳細は、VqTc_EncodeImage()内のコメントを参照して下さい。
 *	* Wed Dec 21 21:39:53 JST 2016 Naoyuki Sawa
 *	- VQTC_DATAHEADER構造体の定義を追加しました。
 *	  dpbmpcnv.exe,及び,P/ECE用の描画ルーチンで参照します。
 *	* Fri Dec 23 23:24:50 JST 2016 Naoyuki Sawa
 *	- コードブックの5バイトの圧縮データの、1バイト目のビット詰めの順序を逆にしました。
 *	  変更前は「aabbccdd」でしたが、変更後は「ddccbbaa」になりました。
 *	  VqTc_DecodeCell()関数で4x4ピクセルをまとめてデコードする時は、変更前の「aabbccdd」の並びの方がシフトとビット送りを同時に行えて効率が良かったのですが、
 *	  framvqtd.cのPDW_Draw_VQTC()関数で1ライン4ピクセルを単独でデコードする時は、特にアセンブラ版の実装において「ddccbbaa」の並びの方が効率が良い事に気付いたからです。
 *	  VqTc_DecodeCell()関数はツールやテストでしか使わないので速度は重要ではなく、描画で使うPDW_Draw_VQTC()関数を高速化する方が重要なので、PDW_Draw_VQTC()関数の高速化を優先して「ddccbbaa」にしました。
 *	* Sat Dec 24 21:19:40 JST 2016 Naoyuki Sawa
 *	- コードブックに格納する色の値を「0=白〜3=黒,4=透明」⇒「0=透明,1=白〜4=黒」に変更しました。
 *	  変更した関数は、clipvqtc.cのVqTc_EncodeCell()とVqTc_DecodeCell()、及び、framvqtd.cのPDW_Draw_VQTC()です。
 *	  変更した理由は、以下の通りです。
 *	- framvqtd.cのPDW_Draw_VQTC()の除算ループにおいて、残りのピクセルが全て0ならばループを打ち切るようにしており、色の値が0であるピクセルが多いほど描画が早くなります。
 *	  一般的に、ゲームの画像のピクセルとしては、白よりも透明の方が多いと思うので、透明を0とする事にしました。
 *	  透明が無く白が多い画像の場合は、今回の変更は逆効果であり、却って遅くなってしまうのですが、一般的には早くなる事の方が多いと思います。
 *	- 高速化の効果を検証してみました。
 *	  極端な例として、完全に透明な画像で、画面全体(128x88)に描画したところ、変更前よりも変更後の方が約23%高速になりました。
 *	  従って、透明部分の多さに比例して、23%を上限として高速化の効果が有ると思います。
 *	* Sun Dec 25 23:57:41 JST 2016 Naoyuki Sawa
 *	- 符号の数の上限を、256⇒65536に変更しました。
 *	  圧縮率を考慮すると256程度が適切なのですが、場合によっては256超過の符号数も使いたい事が有ったからです。
 */
#ifndef __CLIP_VQTC_H__
#define __CLIP_VQTC_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	
 ****************************************************************************/
//VQ圧縮テクスチャ形式のデータヘッダ
typedef struct _VQTC_DATAHEADER {
	unsigned short	sig;	//+ 0, 2 シグネチャ	"QV"固定	PBMP_FILEHEADER.headの流儀に従って、リトルエンディアンで読み込んだ時に'VQ'となるように、文字列の並びとしては逆順にする事にした。
//{{2016/12/25変更:符号の数の上限を、256⇒65536に変更しました。
//	unsigned short	k_1;	//+ 2, 2 符号の数-1	0〜255
//↓2016/12/25変更:符号の数の上限を、256⇒65536に変更しました。
	unsigned short	k_1;	//+ 2, 2 符号の数-1	0〜65535
//}}2016/12/25変更:符号の数の上限を、256⇒65536に変更しました。
} VQTC_DATAHEADER;		//= 4
/*****************************************************************************
 *	
 *****************************************************************************/
int VqTc_CalculateCodeBits(int k);
int VqTc_CalculateCodeBytes(int w, int h, int k);
/*--------------------------------------------------------------------------*/
void VqTc_EncodeCell(const unsigned char src[16], unsigned char dst[5]);
void VqTc_DecodeCell(const unsigned char src[5], unsigned char dst[16]);
/*--------------------------------------------------------------------------*/
int  VqTc_EncodeImage(const void* image/*[stride*h]*/, int w, int h, int stride,       void* codebook/*[k*5]*/, int k,       void* code/*[VqTc_CalculateCodeBytes(w,h,k)]*/);
void VqTc_DecodeImage(      void* image/*[stride*h]*/, int w, int h, int stride, const void* codebook/*[k*5]*/, int k, const void* code/*[VqTc_CalculateCodeBytes(w,h,k)]*/);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_VQTC_H__
