// ＤＣ成分の差分のハフマン符号化
// OnMemory版は#define ONMEM

#include "_jpeglib.h"
#include "jpeg.h"

int m(HuffDC(JDATA(p),short dc,HUFFMAN hufftbl[],short *dc0))
{
short dDC; // 差分値
int bits; // 符号化に必要なビット数=[符号表番号]
int ret;
//	dDC=*dc0-dc; // 差分:前回値-今回値；逆差分；デバッグ用
	dDC=dc-*dc0; // 差分:今回値-前回値
	// JPEG本によると上２式が逆（逆差分式を使っている）ように見える
	    *dc0=dc; // 今回のDC値を返す（次回用）
	
	// 符号化に必要なビット数を求める
	if (dDC==0) { // 差分が0の時の処理
		bits=0;
	} else { // 差分は0でない
		unshort ddc; // signedにするとbit15が符号になり誤動作する
		bits=16;
		//printf("差分:%d/",dDC);
		if (dDC<0) { // 差分が負の時の処理
			// 16-上位から数え０のビットが出てくるまでのビット数
			dDC--; // さらに-1してから
			ddc=dDC;
			//printf("ddc=%b,",ddc);
			while ((signed short)(ddc)<0) { // bit15=1
				ddc<<=1;
				bits--;
			}
			//printf("-(%d)",bits);
		} else { // 差分が正の時の処理
			// 16-上位から数え１のビットが出てくるまでのビット数
			ddc=dDC;
			//printf("ddc=%b,",ddc);
			while ((signed short)(ddc)>=0) { // bit15=0
				ddc<<=1;
				bits--;
			}
			//printf("+(%d)",bits);
		}
	}
	// 差分値をそのままハフマン符号化
	//printf("Huff=");
	//print0b(-hufftbl[bits].len,hufftbl[bits].code);
	ret=m(BitOut(p,hufftbl[bits].code,hufftbl[bits].len)); // 符号語を記録
	#ifndef ONMEM
	if (!ret) {
	#endif
		//printf("/Dat=");
		//print0b(-bits,dDC);
		ret=m(BitOut(p,dDC,bits)); // 差分を記録
	#ifndef ONMEM
	}
	#endif
	//printf("\n");
	return(ret);
}
