#ifndef	HEADER_IMWIN
#define	HEADER_IMWIN

#include "pic.h"
#include "screen.h"
#include "fifo.h"

  /* 画像ウィンドウ */

#define	IMAGEWIN_TITLE	129

	typedef struct _imw {
		struct _imw	*next;
	  	/* 各部品ID */
			int			win;			/* ウィンドウ部品の */
			int			sbar_h;
			int			sbar_v;
			// int			btn;			/* 描画領域用ボタン */
			int			erasebtn;
			int			titlebar;
			int			titlemsg;
		char		title[IMAGEWIN_TITLE+1];
		char		fname[_MAX_PATH];
		PIC			*pic;
		SCRBITMAP	bm;				// 画面出力用ビットマップ
		int			zoom;			// 拡大率
		BOOL		fBoxRubber;
		FRAME		frBoxRubber;	// BOXラバーの PIC 領域(x,y,wid,ht)
		BOOL		fBoxRubber2;
		FRAME		frBoxRubber2;	// BOXラバー２
		BOOL		fLineRubber;
		LIST*		listLineRubber;
		BOOL		fLineRubber2;
		LIST*		listLineRubber2;
	} IMWIN;

  // モジュール初期化
	int imagewin_init(void);

  // 生成・消滅
	IMWIN *imagewin_new(int pixelsize,int width, int height);
	void imagewin_destroy(IMWIN *win);

  // リンク関連
	IMWIN *imagewin_getfirst(void);
	IMWIN *imagewin_getnext(void);
	void imagewin_link(IMWIN *win);
	void imagewin_unlink(IMWIN *win);
	void imagewin_show(IMWIN *win);
	IMWIN *imagewin_getWinFromPart(int objId);
		// オブジェクトＩＤからウィンドウを検索する
	IMWIN *imagewin_getCurrentWin(void);
	void imagewin_setCurrentWin(IMWIN *win);

  // 座標変換
	void imagewin_getScrFrame(IMWIN *win, FRAME *frPic, FRAME *frBitmap);
		// PIC領域(x,y,wid,ht)から、SCRBITMAP領域(x,y,wid,ht)へと変換
	void imagewin_getDispFrame(IMWIN *win,FRAME* frPic);
		// ウィンドウのユーザー領域を、表示画像の PIC 領域(x,y,wid,ht)に変換
	void imagewin_getPosFromMos(IMWIN *win, POINT *mos, POINT *pos);
		// 画面上のマウス座標から、画像内での位置を得る
	BOOL imagewin_PtInPic(IMWIN* win, POINT* pt);
		// 画面座標 pt がウィンドウ内の画像領域にあるかどうか

  // 表示内容更新
	void imagewin_updateBuf(IMWIN *win);
		// PIC内容から、SCRBITMAP全体を再生成する
	void imagewin_updateScr(IMWIN *win);
		// SCRBITMAPの内容を画面に表示。同時にラバー描画も行う
	void imagewin_updateScrPart(IMWIN *win, FRAME *updatefr);
		// PIC領域 updatefr に対応する SCRBITMAP / 画面を更新する

  // ラバー制御
	void imagewin_setBoxRubber(IMWIN* win, FRAME *fr);
		// fr : PIC領域(x,y,wid,ht)
	void imagewin_setBoxRubber2(IMWIN* win, FRAME *fr);
	void imagewin_clearBoxRubber(IMWIN* win);
	void imagewin_clearBoxRubber2(IMWIN* win);
	void imagewin_resetLineRubber(IMWIN* win);
	void imagewin_addLineRubber(IMWIN* win,POINT* p1,POINT* p2);
		// p1,p2 : PIC 座標   p2 が NULL のとき、リストの最初の点とむすぶ
	int imagewin_nLineRubber(IMWIN* win);
	void imagewin_clearLineRubber(IMWIN* win);
	void imagewin_resetLineRubber2(IMWIN* win);
	void imagewin_addLineRubber2(IMWIN* win,POINT* p1,POINT* p2);
		// p1,p2 : PIC 座標   p2 が NULL のとき、リストの最初の点とむすぶ
	int imagewin_nLineRubber2(IMWIN* win);
	void imagewin_clearLineRubber2(IMWIN* win);

  // リサイズ処理
	int imagewin_resize(IMWIN *win, BOOL fRedraw);
		// 子ウィンドウの再配置
	void imagewin_setZoom(IMWIN *win, int zoom);
	void imagewin_updateTitle(IMWIN *win, BOOL fShow);
	void imagewin_setFileName(IMWIN *win, char *fname, BOOL fShow);

  // 画像編集
	void imagewin_storeUndo(IMWIN* win);
	void imagewin_recoverUndo(void);
	void imagewin_copy(IMWIN* srcwin,FRAME* frSrc,
					   IMWIN* destwin,POINT *ptDest);
		// frSrc:PIC領域(x,y,wid,ht)
		// ptDest:PIC座標
	void imagewin_copyarea(IMWIN* srcwin,AREA areaSrc,
						   IMWIN* destwin,POINT *ptDest);

#define	BAR_SIZE	16

#endif	HEADER_IMWIN
