// ＡＣ成分のハフマン復号化＆０のランレングス展開
// ＡＣ成分のハフマン復号化＆０のランレングス展開
// OnMemory版は#define ONMEM

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

int m(iHuffAC(JDATA(p),iHUFFMAN ihufftbl[],unchar cnt[],short yuv[]))
{
int i,blen,run;
int ret;
	//printf("iHuffAC/");
	i=1; // ACは[0]は使わない
	do {
		// ハフマン符号を復号する
		blen=m(CmpiHuff(p,ihufftbl,cnt));
		if (blen<0) return(blen); // error
		//printf("no=%d/",blen); // ハフマンコード表番号
		if (blen==0) { // EOB:このブロック最後まで０
			//printf("EOB:\n");
			do {
				yuv[_zigzag[i++]]=0;
			} while (i<JWV*JWU);
			break;
		}
		
		run=blen/16; // 0のランレングス
		blen%=16; // 値のビット長
		while (run-->0) { // 0の格納
			yuv[_zigzag[i++]]=0;
		}
		if (blen>0) {
			// 値を読み出す
			ret=m(BitIn(p,blen));
			#ifndef ONMEM
			if (ret<0) return(ret);
			#endif
			//printf("元ret=");
			//print0b(blen,ret);
			//if (ret>=(1<<blen)) {
				//printf("←異常");
			//}
			//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
		} else ret=0; // blen=0のときは差分値の読み出し無し
		yuv[_zigzag[i++]]=(short)ret;
		//printf("\n");
	} while (i<JWV*JWU);
	return(0);
}
