home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
art2
/
src.lzh
/
COPY.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-18
|
13KB
|
480 lines
// 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)
// コピー元を指定するイベントループ
// 最初に指定された点が、コピー元の座標1
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 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 ;
}