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

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

int m(iHuffDC(JDATA(p),iHUFFMAN ihufftbl[],unchar cnt[],short yuv[],short *dc))
{
int blen;
int ret=0; // blen=0のときは符号だけの時＝0
	//printf("iHuffDC/");
	// ハフマン符号を復号する
	blen=m(CmpiHuff(p,ihufftbl,cnt));
	if (blen<0) {
	//	printf("CmpiHuff Error:%d\n",blen);
		return(blen);
	}
	if (blen>0) {
		// 差分値を読み出す
		ret=m(BitIn(p,blen));
		#ifndef ONMEM
		if (ret<0) {
		//	printf("BitIn Error:%d\n",ret);
			return(ret);
		}
		#endif
		//printf("元ret=");
		//print0b(blen,ret);
		//printf("/");
		#if 0
		// RISC CPUではこちらの方が速いかも知れない
		if (!(ret&(1<<(blen-1)))) { // 最上位ビットが０の時は負数なので補正する
			//printf("負数");
			ret=ret-((1<<blen)-1);
		}
		#else
		if (!(ret&_iHuffMinusCheck[blen])) { // 最上位ビットが０の時は負数なので補正する
			//printf("負数");
			ret=(_iHuffMinus[blen]|ret)+1;
		}
		#endif
	} // blen=0のときは差分値の読み出し無し
	//printf("ret=%d/",ret);
	// 差分から元の値を計算する
	(*dc)+=(short)ret;
	yuv[0]=*dc;
	return(0);
}
