// 0423-36-6862 taguchi
#define MODULE_COPY

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <egb.h>
#include <wgb.h>
#include <msdos.cf>
#include "art.h"
#include "guisub.h"
#include "wgbmac.H"

#include "imagewin.h"
#include "imgwin.h"
#include "pensel.h"
#include "colsel.h"
#include "fifo.h"
#include "subgrp.h"
#include "desktop.h"
#include "copy.h"

int input_rectarea(IMWIN *win, EVENT *ev_first)
// first:最初のマウス座標
// type:0=矩形
{
	imagewin_storeUndo(win);
  // クリップ枠の設定
	RM_setClipVisibleAllScr();
	RM_setOriginZero();
  // データ構造の初期化
	int type = 0;
	EVENT *ev = ev_first;
	POINT cp = *(POINT*)&ev->info; // 現在のカーソル位置
	POINT lastp = cp;
	FRAME frSrc;      // コピー元領域を表す PIC 領域 (x,y,wid,ht)
  // コピー元を指定するイベントループ
	// 最初に指定された点が、コピー元の座標１
	POINT srcStartPt;
	imagewin_getPosFromMos(win, &cp, &srcStartPt);
	BOOL fFirst = TRUE;
	for (;;)
	{
	  // カーソルの現在位置のオブジェクトID および IMWIN を得る
		int curobj = RM_getObjFromPoint(&cp);
		IMWIN* curwin = imagewin_getWinFromPart(curobj);
	  // ラバー描画
		if (curwin == win && imagewin_PtInPic(curwin, &cp))
		{
			POINT p; imagewin_getPosFromMos(win,&cp,&p);
			FRAME fr;
			fr.X = _min(srcStartPt.x, p.x);
			fr.Y = _min(srcStartPt.y, p.y);
			fr.WID = abs(srcStartPt.x - p.x) + 1;
			fr.HT = abs(srcStartPt.y - p.y) + 1;
			imagewin_setBoxRubber(win, &fr);
		}
		else
			imagewin_clearBoxRubber(win);
	  // 左ボタンがクリックされたら
		if (!fFirst && ev->what == EVMOSDN && (ev->shift & SLEFTBTN) != 0)
		{
			if (curwin == win && imagewin_PtInPic(win, &cp))
			{
				imagewin_clearBoxRubber(win);
			  // コピー元領域が決定したので次にすすむ
				POINT p1;
				imagewin_getPosFromMos(win, &cp, &p1);
				if (p1.x < srcStartPt.x)
					SWAP_INT(p1.x, srcStartPt.x)
				if (p1.y < srcStartPt.y)
					SWAP_INT(p1.y, srcStartPt.y)
				frSrc.X = srcStartPt.x;
				frSrc.Y = srcStartPt.y;
				frSrc.WID = p1.x - srcStartPt.x + 1;
				frSrc.HT  = p1.y - srcStartPt.y + 1;
				lastp = cp;
				break;
			}
			else if (curwin != NULL)
				MMI_ExecEvnt(ev);
		}
	  // 右ボタンがクリックされたら終了
		else if (ev->what == EVMOSDN && (ev->shift & SRIGHTBTN) != 0)
		{
			imagewin_clearBoxRubber(win);
			goto ENDCOPY;
		}
	  // イベントセンス
		do {
			MMI_iosense();
		} while (MMI_GetEvnt(EVALL, &ev) != NOERR);
		fFirst = FALSE;
	  // イベント種別、シフト状態、マウス座標を得る
		cp = *(POINT *) &ev->info;
	}
  // コピー先を指定するイベントループ
	// コピー元のラバーを設定
	imagewin_setBoxRubber(win, &frSrc);
	fFirst = TRUE;
	IMWIN* rubberwin = NULL;
  	for (;;)
  	{
	  // カーソルの現在位置のオブジェクトID および IMWIN を得る
		int curobj = RM_getObjFromPoint(&cp);
		IMWIN* curwin = imagewin_getWinFromPart(curobj);
	  // ラバー描画
		if (curwin != NULL && imagewin_PtInPic(curwin, &cp))
		{
			POINT p; imagewin_getPosFromMos(curwin,&cp,&p);
			FRAME fr = {p.x, p.y, frSrc.WID, frSrc.HT};
			if (rubberwin != NULL && rubberwin != curwin)
				imagewin_clearBoxRubber2(rubberwin);
			imagewin_setBoxRubber2(curwin, &fr);
			rubberwin = curwin;
		}
		else if (rubberwin != NULL)
		{
			imagewin_clearBoxRubber2(rubberwin);
			rubberwin = NULL;
		}
	  // 左ボタンがクリックされたら
		if (!fFirst && ev->what == EVMOSDN && (ev->shift & SLEFTBTN) != 0)
		{
			if (curwin != NULL && imagewin_PtInPic(curwin,&cp))
			{
				if (rubberwin != NULL)
					imagewin_clearBoxRubber2(rubberwin);
				imagewin_clearBoxRubber(win);
				POINT ptDest;
				imagewin_getPosFromMos(curwin, &cp, &ptDest);
				imagewin_copy(win,&frSrc,curwin,&ptDest);
				imagewin_setBoxRubber(win, &frSrc);
			}
			else if (curwin != NULL)
				MMI_ExecEvnt(ev);
		}
	  // 右ボタンがクリックされたら終了
		else if (ev->what == EVMOSDN && (ev->shift & SRIGHTBTN) != 0)
		{
			if (rubberwin != NULL)
				imagewin_clearBoxRubber2(rubberwin);
			imagewin_clearBoxRubber(win);
			goto ENDCOPY;
		}
	  // イベントセンス
		do {
			MMI_iosense();
		} while (MMI_GetEvnt(EVALL, &ev) != NOERR);
		fFirst = FALSE;
	  // 現在のカーソル位置を得る
		cp = *(POINT *)&ev->info;
  	}
ENDCOPY:;
  // クリップ枠の復帰
	RM_recoverOrigin();
	RM_recoverClipVisible() ;
  // 次に続くイベントをキューに積む
	EVENT evbuf;
	evbuf = *ev;
	evbuf.what = EVMOSUP;
	evbuf.shift = (evbuf.shift & (~SRIGHTBTN)) | SLEFTBTN;
	MMI_SetEvnt(&evbuf);
	return NOERR ;
}

int cmd_rectzoomcopy(IMWIN *win, EVENT *ev_first)
// first:最初のマウス座標
// type:0=矩形
{
	imagewin_storeUndo(win);
  // クリップ枠の設定
	RM_setClipVisibleAllScr();
	RM_setOriginZero();
  // データ構造の初期化
	int type = 0;
	EVENT *ev = ev_first;
	POINT cp = *(POINT*)&ev->info; // 現在のカーソル位置
	POINT lastp = cp;
	FRAME frSrc;      // コピー元領域を表す PIC 領域 (x,y,wid,ht)
  // コピー元を指定するイベントループ
	// 最初に指定された点が、コピー元の座標１
	POINT srcStartPt;
	imagewin_getPosFromMos(win, &cp, &srcStartPt);
	BOOL fFirst = TRUE;
	for (;;)
	{
	  // カーソルの現在位置のオブジェクトID および IMWIN を得る
		int curobj = RM_getObjFromPoint(&cp);
		IMWIN* curwin = imagewin_getWinFromPart(curobj);
	  // ラバー描画
		if (curwin == win && imagewin_PtInPic(curwin, &cp))
		{
			POINT p; imagewin_getPosFromMos(win,&cp,&p);
			FRAME fr;
			fr.X = _min(srcStartPt.x, p.x);
			fr.Y = _min(srcStartPt.y, p.y);
			fr.WID = abs(srcStartPt.x - p.x) + 1;
			fr.HT = abs(srcStartPt.y - p.y) + 1;
			imagewin_setBoxRubber(win, &fr);
		}
		else
			imagewin_clearBoxRubber(win);
	  // 左ボタンがクリックされたら
		if (!fFirst && ev->what == EVMOSDN && (ev->shift & SLEFTBTN) != 0)
		{
			if (curwin == win && imagewin_PtInPic(win, &cp))
			{
				imagewin_clearBoxRubber(win);
			  // コピー元領域が決定したので次にすすむ
				POINT p1;
				imagewin_getPosFromMos(win, &cp, &p1);
				if (p1.x < srcStartPt.x)
					SWAP_INT(p1.x, srcStartPt.x)
				if (p1.y < srcStartPt.y)
					SWAP_INT(p1.y, srcStartPt.y)
				frSrc.X = srcStartPt.x;
				frSrc.Y = srcStartPt.y;
				frSrc.WID = p1.x - srcStartPt.x + 1;
				frSrc.HT  = p1.y - srcStartPt.y + 1;
				lastp = cp;
				break;
			}
			else if (curwin != NULL)
				MMI_ExecEvnt(ev);
		}
	  // 右ボタンがクリックされたら終了
		else if (ev->what == EVMOSDN && (ev->shift & SRIGHTBTN) != 0)
		{
			imagewin_clearBoxRubber(win);
			goto ENDCOPY;
		}
	  // イベントセンス
		do {
			MMI_iosense();
		} while (MMI_GetEvnt(EVALL, &ev) != NOERR);
		fFirst = FALSE;
	  // イベント種別、シフト状態、マウス座標を得る
		cp = *(POINT *) &ev->info;
	}
  // コピー先を指定するイベントループ
	// コピー元のラバーを設定
	imagewin_setBoxRubber(win, &frSrc);

	IMWIN* destWin = NULL;
	fFirst = TRUE;
	POINT destStartPt;
	for (;;)
	{
	  // カーソルの現在位置のオブジェクトID および IMWIN を得る
		int curobj = RM_getObjFromPoint(&cp);
		IMWIN* curwin = imagewin_getWinFromPart(curobj);
	  // ラバー描画
		if (curwin == destWin && imagewin_PtInPic(curwin, &cp))
		{
			POINT p; imagewin_getPosFromMos(destWin,&cp,&p);
			FRAME fr;
			fr.X = _min(destStartPt.x, p.x);
			fr.Y = _min(destStartPt.y, p.y);
			fr.WID = abs(destStartPt.x - p.x) + 1;
			fr.HT = abs(destStartPt.y - p.y) + 1;
			imagewin_setBoxRubber2(destWin, &fr);
		}
		else if (destWin != NULL)
			imagewin_clearBoxRubber2(destWin);
	  // 左ボタンがクリックされたら
		if (!fFirst && ev->what == EVMOSDN && (ev->shift & SLEFTBTN) != 0)
		{
			if (destWin == NULL)
				// コピー先の始点が決定
			{

			}


			if (curwin == win && imagewin_PtInPic(win, &cp))
			{
				imagewin_clearBoxRubber(win);
			  // コピー元領域が決定したので次にすすむ
				POINT p1;
				imagewin_getPosFromMos(win, &cp, &p1);
				if (p1.x < srcStartPt.x)
					SWAP_INT(p1.x, srcStartPt.x)
				if (p1.y < srcStartPt.y)
					SWAP_INT(p1.y, srcStartPt.y)
				frSrc.X = srcStartPt.x;
				frSrc.Y = srcStartPt.y;
				frSrc.WID = p1.x - srcStartPt.x + 1;
				frSrc.HT  = p1.y - srcStartPt.y + 1;
				lastp = cp;
				break;
			}
			else if (curwin != NULL)
				MMI_ExecEvnt(ev);
		}
	  // 右ボタンがクリックされたら終了
		else if (ev->what == EVMOSDN && (ev->shift & SRIGHTBTN) != 0)
		{
			imagewin_clearBoxRubber(win);
			goto ENDCOPY;
		}
	  // イベントセンス
		do {
			MMI_iosense();
		} while (MMI_GetEvnt(EVALL, &ev) != NOERR);
		fFirst = FALSE;
	  // イベント種別、シフト状態、マウス座標を得る
		cp = *(POINT *) &ev->info;
	}



	fFirst = TRUE;
	IMWIN* rubberwin = NULL;
  	for (;;)
  	{
	  // カーソルの現在位置のオブジェクトID および IMWIN を得る
		int curobj = RM_getObjFromPoint(&cp);
		IMWIN* curwin = imagewin_getWinFromPart(curobj);
	  // ラバー描画
		if (curwin != NULL && imagewin_PtInPic(curwin, &cp))
		{
			POINT p; imagewin_getPosFromMos(curwin,&cp,&p);
			FRAME fr = {p.x, p.y, frSrc.WID, frSrc.HT};
			if (rubberwin != NULL && rubberwin != curwin)
				imagewin_clearBoxRubber2(rubberwin);
			imagewin_setBoxRubber2(curwin, &fr);
			rubberwin = curwin;
		}
		else if (rubberwin != NULL)
		{
			imagewin_clearBoxRubber2(rubberwin);
			rubberwin = NULL;
		}
	  // 左ボタンがクリックされたら
		if (!fFirst && ev->what == EVMOSDN && (ev->shift & SLEFTBTN) != 0)
		{
			if (curwin != NULL && imagewin_PtInPic(curwin,&cp))
			{
				if (rubberwin != NULL)
					imagewin_clearBoxRubber2(rubberwin);
				imagewin_clearBoxRubber(win);
				POINT ptDest;
				imagewin_getPosFromMos(curwin, &cp, &ptDest);
				imagewin_copy(win,&frSrc,curwin,&ptDest);
				imagewin_setBoxRubber(win, &frSrc);
			}
			else if (curwin != NULL)
				MMI_ExecEvnt(ev);
		}
	  // 右ボタンがクリックされたら終了
		else if (ev->what == EVMOSDN && (ev->shift & SRIGHTBTN) != 0)
		{
			if (rubberwin != NULL)
				imagewin_clearBoxRubber2(rubberwin);
			imagewin_clearBoxRubber(win);
			goto ENDCOPY;
		}
	  // イベントセンス
		do {
			MMI_iosense();
		} while (MMI_GetEvnt(EVALL, &ev) != NOERR);
		fFirst = FALSE;
	  // 現在のカーソル位置を得る
		cp = *(POINT *)&ev->info;
  	}
ENDCOPY:;
  // クリップ枠の復帰
	RM_recoverOrigin();
	RM_recoverClipVisible() ;
  // 次に続くイベントをキューに積む
	EVENT evbuf;
	evbuf = *ev;
	evbuf.what = EVMOSUP;
	evbuf.shift = (evbuf.shift & (~SRIGHTBTN)) | SLEFTBTN;
	MMI_SetEvnt(&evbuf);
	return NOERR ;
}


int input_polygonarea(IMWIN *win, EVENT *ev_first)
// first:最初のマウス座標
// type:0=矩形
{
	imagewin_storeUndo(win);
  // クリップ枠の設定
	RM_setClipVisibleAllScr();
	RM_setOriginZero();
  // データ構造の初期化
	int type = 0;
	EVENT *ev = ev_first;
	POINT cp = *(POINT*)&ev->info; // 現在のカーソル位置
	#define MAXPOINT 2000
	POINT *points = TL_calloc(sizeof(POINT), MAXPOINT);
	int nPoint = 0;
	if (points == NULL)
		goto ENDCOPY;
	POINT lastp = cp;
	POINT lastPicPt;  imagewin_getPosFromMos(win, &lastp, &lastPicPt);
	FRAME frSrc = {lastPicPt.x,lastPicPt.y,lastPicPt.x,lastPicPt.y};
	AREA areaSrc = NULL;
	// 更新中は (x1,y1,x2,y2) 形式
	void updateFrSrc(POINT* pt)
	{
		frSrc.X = _min(frSrc.X, pt->x);
		frSrc.Y = _min(frSrc.Y, pt->y);
		frSrc.X2 = _max(frSrc.X2, pt->x);
		frSrc.Y2 = _max(frSrc.Y2, pt->y);
	}
  // 最初の点を座標配列に登録
	points[nPoint++] = lastPicPt;
  // コピー元を指定するイベントループ
	BOOL fFirst = TRUE;
	for (;;)
	{
	  // カーソルの現在位置のオブジェクトID および IMWIN を得る
		int curobj = RM_getObjFromPoint(&cp);
		IMWIN* curwin = imagewin_getWinFromPart(curobj);
	  // ラバー描画
		if (curwin == win && imagewin_PtInPic(curwin, &cp))
		{
			imagewin_resetLineRubber2(win);
			POINT p2;
			imagewin_getPosFromMos(win, &cp, &p2);
			imagewin_addLineRubber2(win, &lastPicPt, &p2);
		}
		else
		{
			imagewin_resetLineRubber2(win);
			imagewin_updateScr(win);
		}
	  // 左ボタンがクリックされたら
		if (!fFirst && (ev->what == EVMOSDN || ev->what == EVMOSDRAG)
		    && (ev->shift & SLEFTBTN) != 0)
		{
			if (curwin == win && imagewin_PtInPic(win, &cp))
			{
				imagewin_resetLineRubber2(win);
			  // ラバー追加
				POINT p2;
				imagewin_getPosFromMos(win, &cp, &p2);
				imagewin_addLineRubber(win, &lastPicPt, &p2);
				updateFrSrc(&p2);
				points[nPoint++] = p2;
				lastPicPt = p2;
				lastp = cp;
			}
			else if (curwin != NULL)
				MMI_ExecEvnt(ev);
		}
	  // 右ボタンがクリックされたら終了
		else if (ev->what == EVMOSDN && (ev->shift & SRIGHTBTN) != 0)
		{
			imagewin_resetLineRubber2(win);
			if (imagewin_nLineRubber(win) >= 2)
			{
			  // ラバー追加
				imagewin_addLineRubber(win, &lastPicPt, NULL);
				imagewin_updateScr(win);
				break;
			}
			else
			{
				imagewin_resetLineRubber(win);
				imagewin_updateScr(win);
				goto ENDCOPY;
			}
		}
	  // イベントセンス
		do {
			MMI_iosense();
		} while (MMI_GetEvnt(EVALL, &ev) != NOERR);
		fFirst = FALSE;
	  // イベント種別、シフト状態、マウス座標を得る
		cp = *(POINT *) &ev->info;
	}
  // frSrc を (x,y,wid,ht) 形式に変更
	SortRect((Rect*)&frSrc);
	frSrc.WID = frSrc.X2 - frSrc.X + 1;
	frSrc.HT  = frSrc.Y2 - frSrc.Y + 1;
  // areaSrc を作成
	areaSrc = area_new(frSrc.X, frSrc.Y, frSrc.WID, frSrc.HT);
	if (areaSrc == NULL)
		goto ENDCOPY;
	area_polygon(areaSrc, points, nPoint);
  // コピー先を指定するイベントループ
	fFirst = TRUE;
	IMWIN* rubberwin = NULL;
  	for (;;)
  	{
	  // カーソルの現在位置のオブジェクトID および IMWIN を得る
		int curobj = RM_getObjFromPoint(&cp);
		IMWIN* curwin = imagewin_getWinFromPart(curobj);
	  // ラバー描画
		if (curwin != NULL && imagewin_PtInPic(curwin, &cp))
		{
			POINT p; imagewin_getPosFromMos(curwin,&cp,&p);
			FRAME fr = {p.x, p.y, frSrc.WID, frSrc.HT};
			if (rubberwin != NULL && rubberwin != curwin)
				imagewin_clearBoxRubber2(rubberwin);
			imagewin_setBoxRubber2(curwin, &fr);
			rubberwin = curwin;
		}
		else if (rubberwin != NULL)
		{
			imagewin_clearBoxRubber2(rubberwin);
			rubberwin = NULL;
		}
	  // 左ボタンがクリックされたら
		if (!fFirst && ev->what == EVMOSDN && (ev->shift & SLEFTBTN) != 0)
		{
			if (curwin != NULL && imagewin_PtInPic(curwin,&cp))
			{
				if (rubberwin != NULL)
					imagewin_clearBoxRubber2(rubberwin);
				POINT ptDest;
				imagewin_getPosFromMos(curwin, &cp, &ptDest);
				imagewin_copyarea(win, areaSrc, curwin, &ptDest);
			}
			else if (curwin != NULL)
				MMI_ExecEvnt(ev);
		}
	  // 右ボタンがクリックされたら終了
		else if (!fFirst && ev->what==EVMOSDN && (ev->shift & SRIGHTBTN) != 0)
		{
			if (rubberwin != NULL)
				imagewin_clearBoxRubber2(rubberwin);
			break;
		}
	  // イベントセンス
		do {
			MMI_iosense();
		} while (MMI_GetEvnt(EVALL, &ev) != NOERR);
		fFirst = FALSE;
	  // 現在のカーソル位置を得る
		cp = *(POINT *)&ev->info;
  	}
ENDCOPY:;
	imagewin_resetLineRubber(win);
	imagewin_updateScr(win);
	if (areaSrc != NULL)
		area_delete(areaSrc);
	if (points != NULL)
		TL_free(points);
  // クリップ枠の復帰
	RM_recoverOrigin();
	RM_recoverClipVisible() ;
  // 次に続くイベントをキューに積む
	EVENT evbuf;
	evbuf = *ev;
	evbuf.what = EVMOSUP;
	evbuf.shift = (evbuf.shift & (~SRIGHTBTN)) | SLEFTBTN;
	MMI_SetEvnt(&evbuf);
	return NOERR ;
}

int cmd_polygonfill(IMWIN *win, EVENT *ev_first)
// first:最初のマウス座標
// type:0=矩形
{
	imagewin_storeUndo(win);
  // クリップ枠の設定
	RM_setClipVisibleAllScr();
	RM_setOriginZero();
  // データ構造の初期化
	int type = 0;
	EVENT *ev = ev_first;
	POINT cp = *(POINT*)&ev->info; // 現在のカーソル位置
	#define MAXPOINT 2000
	POINT *points = TL_calloc(sizeof(POINT), MAXPOINT);
	int nPoint = 0;
	if (points == NULL)
		goto ENDCOPY;
	POINT lastp = cp;
	POINT lastPicPt;  imagewin_getPosFromMos(win, &lastp, &lastPicPt);
	FRAME frSrc = {lastPicPt.x,lastPicPt.y,lastPicPt.x,lastPicPt.y};
	AREA areaSrc = NULL;
	// 更新中は (x1,y1,x2,y2) 形式
	void updateFrSrc(POINT* pt)
	{
		frSrc.X = _min(frSrc.X, pt->x);
		frSrc.Y = _min(frSrc.Y, pt->y);
		frSrc.X2 = _max(frSrc.X2, pt->x);
		frSrc.Y2 = _max(frSrc.Y2, pt->y);
	}
  // 最初の点を座標配列に登録
	points[nPoint++] = lastPicPt;
  // コピー元を指定するイベントループ
	BOOL fFirst = TRUE;
	for (;;)
	{
	  // カーソルの現在位置のオブジェクトID および IMWIN を得る
		int curobj = RM_getObjFromPoint(&cp);
		IMWIN* curwin = imagewin_getWinFromPart(curobj);
	  // ラバー描画
		if (curwin == win && imagewin_PtInPic(curwin, &cp))
		{
			imagewin_resetLineRubber2(win);
			POINT p2;
			imagewin_getPosFromMos(win, &cp, &p2);
			imagewin_addLineRubber2(win, &lastPicPt, &p2);
		}
		else
		{
			imagewin_resetLineRubber2(win);
			imagewin_updateScr(win);
		}
	  // 左ボタンがクリックされたら
		if (!fFirst && (ev->what == EVMOSDN || ev->what == EVMOSDRAG)
		    && (ev->shift & SLEFTBTN) != 0)
		{
			if (curwin == win && imagewin_PtInPic(win, &cp))
			{
				imagewin_resetLineRubber2(win);
			  // ラバー追加
				POINT p2;
				imagewin_getPosFromMos(win, &cp, &p2);
				imagewin_addLineRubber(win, &lastPicPt, &p2);
				updateFrSrc(&p2);
				points[nPoint++] = p2;
				lastPicPt = p2;
				lastp = cp;
			}
			else if (curwin != NULL)
				MMI_ExecEvnt(ev);
		}
	  // 右ボタンがクリックされたら終了
		else if (ev->what == EVMOSDN && (ev->shift & SRIGHTBTN) != 0)
		{
			imagewin_resetLineRubber2(win);
			if (imagewin_nLineRubber(win) >= 2)
			{
			  // ラバー追加
				imagewin_addLineRubber(win, &lastPicPt, NULL);
				imagewin_updateScr(win);
				break;
			}
			else
			{
				imagewin_resetLineRubber(win);
				imagewin_updateScr(win);
				goto ENDCOPY;
			}
		}
	  // イベントセンス
		do {
			MMI_iosense();
		} while (MMI_GetEvnt(EVALL, &ev) != NOERR);
		fFirst = FALSE;
	  // イベント種別、シフト状態、マウス座標を得る
		cp = *(POINT *) &ev->info;
	}
	imagewin_clearLineRubber(win);
  // frSrc を (x,y,wid,ht) 形式に変更
	SortRect((Rect*)&frSrc);
	frSrc.WID = frSrc.X2 - frSrc.X + 1;
	frSrc.HT  = frSrc.Y2 - frSrc.Y + 1;
  // areaSrc を作成
	areaSrc = area_new(frSrc.X, frSrc.Y, frSrc.WID, frSrc.HT);
	if (areaSrc == NULL)
		goto ENDCOPY;
	area_polygon(areaSrc, points, nPoint);
  // 領域塗りつぶし
	PIXEL pix;
	colsel_getPixel(&pix);
	pic_beginUpDate(win->pic);
	pic_fillarea(win->pic, areaSrc, &pix);
	FRAME frUpdate;
	pic_endUpDate(win->pic, &frUpdate);
	imagewin_updateScrPart(win, &frUpdate);
ENDCOPY:;
	imagewin_resetLineRubber(win);
	imagewin_updateScr(win);
	if (areaSrc != NULL)
		area_delete(areaSrc);
	if (points != NULL)
		TL_free(points);
  // クリップ枠の復帰
	RM_recoverOrigin();
	RM_recoverClipVisible() ;
  // 次に続くイベントをキューに積む
	EVENT evbuf;
	evbuf = *ev;
	evbuf.what = EVMOSUP;
	evbuf.shift = (evbuf.shift & (~SRIGHTBTN)) | SLEFTBTN;
	MMI_SetEvnt(&evbuf);
	return NOERR ;
}
