// ファイル用ハフマンテーブル作成
// ハフマンテーブルは内部で使う形式とファイルに格納する形式が違うのでこれを変換する

#include <stdlib.h>	// qsort()
#include "_jpeglib.h"
#include "jpeg.h"

// DC用は#define DC

#define	DEBUG	0
// デバッグモードはx68上でのみ有効

static int cmpihuff(iHUFFMAN *ih1,iHUFFMAN *ih2)
{
	return (ih1->code-ih2->code);
}

#ifdef DC
int MakeHuffDC(unchar *hwork,HUFFMAN huff[]            ,int huffcnt)
#else
int MakeHuffAC(unchar *hwork,HUFFMAN huff[ACLEN][ACBIT],int huffcnt)
#endif
{
int i,j,sz;
iHUFFMAN ihuff[16*16];
unchar cnt[1+16];
	// iHUFFMAN構造体に代入(AC/DCの違いはここだけ)
	#ifdef DC
	for (i=0;i<huffcnt;i++) {
		ihuff[i].code=huff[i].code;
		ihuff[i].len =huff[i].len;
		ihuff[i].dat =i;
	}
	#else
	{
	int k,l;
	for (l=k=j=i=0;i<huffcnt;i++) {
		ihuff[i].code=huff[j][k].code;
		ihuff[i].len =huff[j][k].len;
		ihuff[i].dat =l++;
		if (++k==11) {
			j++;
			k=0;
			l+=5; // 16単位に飛ばす
		}
	}
	}
	#endif
	#if DEBUG >= 1
	printf("個数＝%d\n",i);
	#endif
	
	// .codeでソート（小→大）
	qsort(ihuff,i,sizeof(iHUFFMAN),cmpihuff);
	#if DEBUG >= 2
	for (j=0;j<i  ;j++) {
		printf("%16b,%d\n",ihuff[j].code,ihuff[j].len);
	}
	#endif
	
	// .len毎の個数を数える
	// len種類は１〜１６の１６種類しかない
	// しかし処理の簡略化のため、[len]とする。
	for (j=0;j<=16;j++) cnt[j]=0; // カウントクリア
	for (j=0;j<i  ;j++) cnt[ihuff[j].len]++; // カウント
	#if DEBUG >= 1
	for (j=0;j<=16;j++) {
		printf("cnt[%d]＝%d\n",j,cnt[j]);
	}
	#endif
	
	// cnt[]を出力
	for (j=1;j<=16;j++) *hwork++=cnt[j];
	sz=16;
	
	// .datを順に出力
	cnt[0]=0; // [0]は無効なので捨てる
	for (j=0;j<i;j++) {
		if (cnt[ihuff[j].len]>0) {
			*hwork++=ihuff[j].dat;
			sz++;
		}
	}
	return(sz); // テーブルサイズ
}
