//------------------------------------------------------------------------
// 圧縮パラメーター設定
// 本来Pressの一部分であるが、リスタートマーカー数の計算結果が
// ヘッダー出力に必要なので分離した。

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

//------------------------------------------------------------------------

int PressParamX(int gsx,int gsy,int *gwx,int *gwy,long mode,short *rstcnt,int *w)
// 圧縮パラメーター計算
{
int mcux;
	/*	mcux
	1:1:1	JWX
	4:1:1	JWX*2
	2-:1:1	JWX*2
	2I:1:1	JWX
	*/
	switch (mode&MD_AMODE) {
		case MD_111: // 1:1:1
		case MD_2I11: // 2I:1:1
			mcux=JWX;
			break;
		case MD_411: // 4:1:1
		case MD_2_11: // 2-:1:1
			mcux=JWX*2;
			break;
	}
	// 圧縮サイズ補正：ＧＲＡＭを超える時はカットする
	if (gsx+*gwx>=X68GWX) *gwx=X68GWX-gsx;
	if (gsy+*gwy>=X68GWY) *gwy=X68GWY-gsy;
	
	// リスタートマーカー数補正
	if (*rstcnt>0) {
		int mcus;
		mcus=(*gwx)/mcux+(((*gwx)%mcux)>0); // １ラインのＭＣＵの数（不完全ＭＣＵを含む）
		//printf("gwx=%d,mcux=%d,mcu数=%d",*gwx,mcux,mcus);
		// １ラインのＭＣＵの半分以上にはならない（その時は各ＭＣＵ毎になる）
		// 何故ならば、絶対に等分配なので、１個入れても１／２になるから。
		if (*rstcnt>=mcus/2) *rstcnt=mcus;
		else {
			// 割り切れる数を計算する
			while ((mcus%(*rstcnt))!=0) (*rstcnt)--;
		}
		//printf("rstcnt=%d\n",*rstcnt);
	}
	// 倍率による横幅補正
	{
	int ww=1;
	*w=1;
	switch (mode&MD_BMODE) {
		case MD_1_2: // 縦横1/2
			ww=2;
			break;
		case MD_1_4: // 縦横1/4
			ww=4;
			break;
		case MD_1_8: // 縦横1/8
			ww=8;
			break;
	}
	if (ww!=1) {
		if (*gwx>=ww && *gwy>=ww) *w=ww;
		// else サイズが小さすぎるので縮小不可
	}
	}
	return(mcux*(*w));
}

//------------------------------------------------------------------------
