/*	
 *	clipjpeg.h
 *
 *	JPEG Decoder
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2009 Naoyuki Sawa
 *
 *	* Fri Feb 06 22:32:46 JST 2009 Naoyuki Sawa
 *	- 作成開始。
 *	* Mon Feb 09 23:11:25 JST 2009 Naoyuki Sawa
 *	- 1st リリース。
 */
#ifndef __CLIP_JPEG_H__
#define __CLIP_JPEG_H__

/****************************************************************************
 *	
 ****************************************************************************/

/* メモリ上のJPEGデータをデコードします。
 * [in]
 *	data_ptr		JPEGデータの先頭アドレス。
 *	size_proc		幅・高さ通知コールバック。(NULL可)
 *	draw_proc		ピクセル描画コールバック。(NULL可)
 *	user_data		任意のユーザーデータ。
 * [out]
 *	戻り値			JPEGデータの終端アドレス。
 *				将来的に、モーションJPEGに対応するための戻り値です。
 *				モーションJPEGについて未調査のため、実際に役立つかどうかわかりません。
 * [note]
 *	* デコード可能なJPEGデータは、Baseline DCT形式(SOF0)のみです。
 *	  Baseline DCT形式の次によく使われる、Progressive DCT形式(SOF2)はデコードできません。
 *	  Progressive DCT形式も含めて、他の形式のJPEGデータを指定した場合の動作は未定義です。
 *	* size_proc、draw_procの両方を指定した場合、必ずsize_proc、draw_procの順にコールバックします。
 *	  従って、size_procで幅・高さに応じた展開バッファを割当て、draw_procで格納することができます。
 *	  または、draw_procで直接、画面に描画を行うこともできます。
 *	* すべてのピクセルに対してdraw_procをコールバックするため、大きな画像のデコードには時間がかかります。
 *	  本関数は、デコードを途中で中止する機能を持っていませんが、setjmp、longjmpを利用して中止が可能です。
 *	  draw_procの中で、pcePadGetDirectなどを使って中止を判断し、longjmpで呼び出し元へ戻ってください。
 *	  本関数は、内部でリソース割当てを行っていませんので、longjmpで中止してもリソース漏れは発生しません。
 * [example]
 *	jmp_buf jb;
 *	int width;
 *	int height;
 *	static void my_size_proc(int w, int h, void* user_data) {
 *		width = w;
 *		height = h;
 *	}
 *	static void my_draw_proc(int x, int y, int c, void* user_data) {
 *		render_point(&render, x, y, (c >> 4) ^ 15);
 *		if(pcePadGetDirect()) {
 *			longjmp(jb, 1);
 *		}
 *	}
 *	void example() {
 *		if(!setjmp(jb)) {
 *			jpeg_decode(JPEG_DATA, my_size_proc, my_draw_proc, NULL);
 *		}
 *		render_printf(&render, 0, 0, 0, 15, "%d x %d", width, height);
 *	}
 */
const void* jpeg_decode(const void* data_ptr,
	void (*size_proc)(int w, int h, void* user_data),
	void (*draw_proc)(int x, int y, int c, void* user_data),
	void* user_data);

#endif /*__CLIP_JPEG_H__*/

