// 不完全ＭＣＵになる時のＲＧＢ読み出し（機種依存あり）
// 不完全ＭＣＵを補間したデータを用意し、これをrgb2yuvに与える。
// ついでに倍率処理も行う。

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

void GetRGB(unshort *gram,unshort *vram,int mcux,int mcuy,int w,int dx,int dy)
// gramをホーム座標とする幅mcux,mcuyの領域からgramデータを読み取りvramへ格納する。
// この時、幅dx,dyを越える領域は不完全MCU領域であり、補間する。
// vram[16*16] : 4:1:1で16*16／間の不要データは詰めるのでこれだけで良い
{
short x,y,first=1;
unshort *gram0,rgb,rgb0;
	// dx,dy=0は全体＝補間なしの印（全体が補間と言うことはあり得ないのでこれで良い）
//	printf("mcux,mcuy=%d,%d/w=%d/dx,dy=%d,%d\n",mcux,mcuy,w,dx,dy);
	#if 0 // 理屈上ありえない引数なので判定を削除；高速化
	if (dx==0) dx=mcux; // 全体
	if (dy==0) dy=mcuy; // 全体
	#endif
	for (y=0;y<mcuy;y+=w) {
		gram0=gram;
		for (x=0;x<mcux;x+=w) {
			if (x<dx && y<dy) { // 完全領域
				rgb=*gram;
				gram+=w;
				*vram++=rgb;
			} else { // 不完全領域の時は補間する
				if (first) {
					// 一度補間領域に入ったら、後はずっと同じ色
					rgb0=rgb;
					first=0;
				}
				*vram++=rgb0;
			}
		}
		gram=gram0+X68GWX*w;
	}
}

/*
全てのＭＣＵにおいてこのような処理をかませばRGB2YUVが非常に楽になるが、
メモリアクセスがgram->mem->処理と２重になり遅くなるので止めている。
但し、マシンパワーが解決する問題ではある。

最初はサンプリングファクター毎にRGB2YUVを用意していたが、
余りに面倒＆バグが取れないので、遅くてもこの方法に変更した。
不完全ＭＣＵ領域は画像の右及び下端のみなので数は多くないので良いだろう。

又、この中に倍率処理があるので、倍率付き圧縮処理もこれを使うことにした。
倍率付き圧縮は元々データを間引く分処理が速いので、
このルーチンを入れても十分元が採れる。
それよりも、RGB2YUVから倍率処理を省けるので倍率無し時に速くなる。
*/
