home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
art2
/
src.lzh
/
IMAGEWIN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-19
|
21KB
|
775 lines
/*====================================================
ARTemis
(version 1.3)
FM-TOWNS 用ペイントツール
by 松内 良介 1994
====================================================*/
#if 0
// モジュール初期化
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);
// オブジェクトIDからウィンドウを検索する
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);
// リサイズ、表示倍率変更など
void imagewin_setFileName(IMWIN *win, char *fname, BOOL fShow);
void imagewin_updateTitle(IMWIN *win, BOOL fShow);
int imagewin_resize(IMWIN *win, BOOL fRedraw);
// 子ウィンドウの再配置
void imagewin_setZoom(IMWIN *win, int zoom);
// 画像編集
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);
#endif
#define MODULE_IMWIN
#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 "alert.h"
#include "subgrp.h"
#include "imagewin.h"
#include "imgwin.h"
#include "desktop.h"
#define PIXELSIZE 2
BOOL art_IntersectRect(FRAME* frdest, FRAME* fr1, FRAME* fr2)
// (x,y,wid,ht) で表された FRAME の intersect を得る
{
FRAME fr;
fr.X = _max(fr1->X, fr2->X);
fr.Y = _max(fr1->Y, fr2->Y);
fr.X2 = _min(fr1->X+fr1->WID, fr2->X+fr2->WID);
fr.Y2 = _min(fr1->Y+fr1->HT, fr2->Y+fr2->HT);
fr.WID = fr.X2 - fr.X;
fr.HT = fr.Y2 - fr.Y;
if (fr.WID <= 0 || fr.HT <= 0)
return FALSE;
else
{
if (frdest != NULL)
*frdest = fr;
return TRUE;
}
}
/*--------------------------------------------------------*/
/* モジュール内データ構造 */
/*--------------------------------------------------------*/
IMWIN *winlist = NULL;
IMWIN *curptr;
/*--------------------------------------------------------*/
/* モジュールの初期化 */
/*--------------------------------------------------------*/
int imagewin_init(void)
{
winlist = NULL;
return NOERR;
}
/*--------------------------------------------------------*/
/* 生成・消滅 */
/*--------------------------------------------------------*/
IMWIN *imagewin_new(int pixelsize,int width, int height)
{
IMWIN *w ;
if ((w = TL_calloc(1, sizeof(IMWIN))) == NULL)
return NULL;
// PIC 部品の生成
if ((w->pic = pic_new(pixelsize,width,height)) == NULL)
{ TL_free(w); return NULL; }
// データ構造の初期化
w->fBoxRubber = FALSE;
w->fBoxRubber2 = FALSE;
w->zoom = 1;
/* ひな型部品の複製をつくる */
w->win = MMI_SendMessage( idImageWin, MM_NEW, 0 ) ;
w->sbar_h = MMI_SendMessage( idImageHSBar, MM_NEW, 0 ) ;
w->sbar_v = MMI_SendMessage( idImageVSBar, MM_NEW, 0 ) ;
w->titlebar = MMI_SendMessage( idImageTitleDBtn, MM_NEW, 0 );
w->titlemsg = MMI_SendMessage( idImageTitleMsg, MM_NEW, 0 );
w->erasebtn = MMI_SendMessage( idImageEraseDBtn, MM_NEW, 0 );
/* それぞれの部品をくっつける */
MMI_SendMessage( w->sbar_h, MM_ATTACH, 1, w->win ) ;
MMI_SendMessage( w->sbar_v, MM_ATTACH, 1, w->win ) ;
MMI_SendMessage( w->titlebar, MM_ATTACH, 1, w->win ) ;
MMI_SendMessage( w->titlemsg, MM_ATTACH, 1, w->win ) ;
MMI_SendMessage( w->erasebtn, MM_ATTACH, 1, w->win ) ;
// ウィンドウのタイトルを作成
imagewin_updateTitle(w, FALSE);
// 各部品の配置(画面バッファも同時に確保)
if (imagewin_resize(w, FALSE) != NOERR)
{
imagewin_destroy(w);
return NULL;
}
// おわり
return w;
}
void imagewin_destroy(IMWIN *win)
{
MMI_SendMessage( win->win, MM_DESTROY, 0 );
if (win->bm != NULL)
scrbitmap_delete(win->bm);
if (win->pic != NULL)
pic_destroy(win->pic);
TL_free(win);
}
/*--------------------------------------------------------*/
/* リンク関連 */
/*--------------------------------------------------------*/
IMWIN *imagewin_getfirst(void)
{
curptr = winlist;
return curptr;
}
IMWIN *imagewin_getnext(void)
{
if (curptr == NULL)
return NULL;
curptr = curptr->next;
return curptr;
}
void imagewin_link(IMWIN *win)
{
win->next = winlist;
winlist = win;
MMI_SendMessage(win->win, MM_ATTACH, 1, idDesktopWinAttachHyper);
MMI_SendMessage(win->win, MM_WAKE, 0 );
}
void imagewin_show(IMWIN *win)
{
WINCLIP *clipStack;
WIN_beginUpDateObj(win->win, &clipStack);
MMI_SendMessage(win->win, MM_SHOW, 0);
WIN_endUpDateObj(clipStack);
}
void imagewin_unlink(IMWIN *win)
{
IMWIN *w,*prev;
for (w=winlist,prev=NULL; w!=NULL; prev=w,w=w->next)
{
if (w == win)
{
if (prev==NULL)
winlist = w->next;
else
prev->next = w->next;
}
}
MMI_SendMessage(win->win, MM_ERASE, 0);
MMI_SendMessage(win->win, MM_DETACH, 0);
}
IMWIN *imagewin_getWinFromPart(int objId)
/* 部品IDからどの IMWIN であるかを得る */
{
IMWIN *win;
for (win=imagewin_getfirst(); win!=NULL; win=imagewin_getnext())
{
if ( win->win == objId || win->sbar_h == objId ||
win->sbar_v == objId || /* win->btn == objId || */
win->erasebtn == objId || win->titlebar == objId ||
win->titlemsg == objId )
return win;
}
return NULL;
}
static IMWIN *curwin = NULL;
IMWIN *imagewin_getCurrentWin(void)
{
return curwin;
}
void imagewin_setCurrentWin(IMWIN *win)
{
curwin = win;
}
/*--------------------------------------------------------*/
/* 座標変換 */
/*--------------------------------------------------------*/
void imagewin_getDispFrame(IMWIN *win, FRAME *fr)
// ウィンドウのユーザー領域を、表示画像の PIC 領域(x,y,wid,ht)に変換
{
FRAME frUser, ret;
RM_getWinUserFrame(win->win, &frUser);
ret.X = RM_getScrollPos(win->sbar_h);
ret.Y = RM_getScrollPos(win->sbar_v);
ret.WID = (frUser.X2 - frUser.X + 1 + win->zoom-1) / win->zoom;
ret.HT = (frUser.Y2 - frUser.Y + 1 + win->zoom-1) / win->zoom;
if (fr!=NULL)
*fr = ret;
}
void imagewin_getScrFrame(IMWIN *win, FRAME *picfr, FRAME *scrfr)
// PIC領域(x,y,wid,ht)から、SCRBITMAP領域(x,y,wid,ht)へと変換
{
FRAME ret, pfr;
imagewin_getDispFrame(win, &pfr);
ret.X = (picfr->X - pfr.X) * win->zoom;
ret.Y = (picfr->Y - pfr.Y) * win->zoom;
ret.WID = picfr->WID * win->zoom;
ret.HT = picfr->HT * win->zoom;
*scrfr = ret;
}
void imagewin_getPosFromMos(IMWIN *win, POINT *mos, POINT *pos)
/* マウスカーソル位置が画像内のどこであるかを得る */
/*
[引数]
win : 画像ウィンドウ
mos : マウス座標
[結果]
pos : 画像内での座標
*/
{
FRAME frUser;
RM_getWinUserFrame(win->win, &frUser);
FRAME frDisp;
imagewin_getDispFrame(win, &frDisp);
pos->x = frDisp.X + (mos->x - frUser.X) / win->zoom;
pos->y = frDisp.Y + (mos->y - frUser.Y) / win->zoom;
}
BOOL imagewin_PtInPic(IMWIN* win, POINT* pt)
// pt :画面座標
{
FRAME frUser;
RM_getWinUserFrame(win->win, &frUser);
if (PtInRect((Rect*)&frUser,(Point*)pt))
return TRUE;
else
return FALSE;
}
/*--------------------------------------------------------*/
/* SCRBITMAP / 画面の更新 */
/*--------------------------------------------------------*/
void imagewin_updateBuf(IMWIN *win)
/* 画像内容の変更があった場合に、ユーザー領域バッファの内容を更新 */
{
FRAME frDisp;
imagewin_getDispFrame(win, &frDisp);
if (win->pic != NULL && win->bm != NULL)
pic_getScrBitmap(win->pic, win->bm, 0,0, &frDisp, win->zoom);
}
void imagewin_updateScr(IMWIN *win)
{
BEGINPAINT(win->win)
FRAME frUser;
RM_getWinUserFrame(win->win, &frUser);
if (win->bm != NULL)
scrbitmap_draw(win->bm, frUser.X, frUser.Y);
// ラバーを上書きする
FRAME frDisp;
imagewin_getDispFrame(win, &frDisp);
// ボックスラバー描画関数
void boxrubber(FRAME* fr)
// fr:PIC領域(x,y,wid,ht)
{
if (win->zoom == 1)
{
WGB_RBOXLINE(guiEgbPtr,
frUser.X + (fr->X - frDisp.X),
frUser.Y + (fr->Y - frDisp.Y),
fr->WID, fr->HT, RMcol(WHITE), 4);
}
else
{
FRAME frBitmap;
void draw(void)
{
WGB_RBOXFILL(guiEgbPtr,
frUser.X + frBitmap.X,
frUser.Y + frBitmap.Y,
frBitmap.WID, frBitmap.HT, RMcol(WHITE),4);
}
{ FRAME frPic = {fr->X,fr->Y,fr->WID,1};
imagewin_getScrFrame(win, &frPic, &frBitmap); }
draw();
if (fr->HT >= 2)
{
{ FRAME frPic = {fr->X,fr->Y+fr->HT-1,fr->WID,1};
imagewin_getScrFrame(win, &frPic, &frBitmap); }
draw();
}
if (fr->HT >= 3)
{
{ FRAME frPic = {fr->X,fr->Y+1,1,fr->HT-2};
imagewin_getScrFrame(win, &frPic, &frBitmap); }
draw();
if (fr->WID >= 2)
{
{ FRAME frPic = {fr->X+fr->WID-1,fr->Y+1,1,fr->HT-2};
imagewin_getScrFrame(win, &frPic, &frBitmap); }
draw();
}
}
}
}
if (win->fBoxRubber)
boxrubber(&win->frBoxRubber);
if (win->fBoxRubber2)
boxrubber(&win->frBoxRubber2);
// 直線ラバー描画関数
void linerubber(LIST* list)
{
for (list_top(list); !list_isOut(list); list_next(list))
{
FRAME fr;
list_getData(list, &fr);
if (win->zoom == 1)
{
WGB_LINE(guiEgbPtr,
frUser.X + (fr.X - frDisp.X),
frUser.Y + (fr.Y - frDisp.Y),
frUser.X + (fr.X2 - frDisp.X),
frUser.Y + (fr.Y2 - frDisp.Y), RMcol(WHITE), 4);
}
else
{
void putpixel(int x,int y)
{
if (frDisp.X <= x && x < frDisp.X + frDisp.WID &&
frDisp.Y <= y && y < frDisp.Y + frDisp.HT)
{
int tx = frUser.X + (x - frDisp.X) * win->zoom;
int ty = frUser.Y + (y - frDisp.Y) * win->zoom;
WGB_RBOXFILL(guiEgbPtr, tx,ty,win->zoom,win->zoom,
RMcol(WHITE), 4);
}
}
do_line(fr.X,fr.Y,fr.X2,fr.Y2,putpixel);
}
}
}
if (win->fLineRubber)
linerubber(win->listLineRubber);
if (win->fLineRubber2)
linerubber(win->listLineRubber2);
ENDPAINT
}
void imagewin_updateScrPart(IMWIN *win, FRAME *updatefr)
// PIC領域updatefr(x,y,wid,ht) に対応する SCRBITMAP と画面を更新
{
// 更新の必要な PIC 領域を得る
FRAME frDisp; // 画面に表示されている PIC 領域
FRAME frUpdate; // 更新の必要な PIC 領域
imagewin_getDispFrame(win, &frDisp);
if (!art_IntersectRect(&frUpdate, &frDisp, updatefr))
return;
// その PIC 領域に対応した SCRBITMAP 領域を更新する
FRAME frDraw; // 更新の必要な SCRBITMAP 領域
imagewin_getScrFrame(win, &frUpdate, &frDraw);
if (win->pic != NULL && win->bm != NULL)
pic_getScrBitmap(win->pic,win->bm,frDraw.X,frDraw.Y,&frUpdate,
win->zoom);
// 画面に描画
BEGINPAINT(win->win)
FRAME frUser; RM_getWinUserFrame(win->win, &frUser);
if (win->bm != NULL)
scrbitmap_drawPart(win->bm, &frDraw, frUser.X, frUser.Y);
ENDPAINT
}
/*--------------------------------------------------------*/
/* ラバー制御 */
/*--------------------------------------------------------*/
void imagewin_setBoxRubber(IMWIN* win, FRAME *fr)
// fr : PIC領域(x,y,wid,ht)
{
win->fBoxRubber = TRUE;
win->frBoxRubber = *fr;
imagewin_updateScr(win);
}
void imagewin_setBoxRubber2(IMWIN* win, FRAME *fr)
// fr : PIC領域(x,y,wid,ht)
{
win->fBoxRubber2 = TRUE;
win->frBoxRubber2 = *fr;
imagewin_updateScr(win);
}
void imagewin_clearBoxRubber(IMWIN* win)
{
win->fBoxRubber = FALSE;
imagewin_updateScr(win);
}
void imagewin_clearBoxRubber2(IMWIN* win)
{
win->fBoxRubber2 = FALSE;
imagewin_updateScr(win);
}
void imagewin_resetLineRubber(IMWIN* win)
{
if (!win->fLineRubber)
return;
LIST* list = win->listLineRubber;
while (!list_isEmpty(list))
{ list_top(list); list_deleteData(list); }
}
void imagewin_addLineRubber(IMWIN* win,POINT* p1,POINT* p2)
{
if (!win->fLineRubber)
{
win->fLineRubber = TRUE;
win->listLineRubber = list_new(sizeof(FRAME));
}
LIST* list = win->listLineRubber;
FRAME fr;
if (p2 == NULL)
{
list_top(list); FRAME frTop; list_getData(list,&frTop);
fr.X2 = frTop.X;
fr.Y2 = frTop.Y;
}
else
fr.X2 = p2->x, fr.Y2 = p2->y;
fr.X = p1->x, fr.Y = p1->y;
list_moveTo(list, list_getDataNum(list));
list_insertData(list,&fr);
imagewin_updateScr(win);
}
int imagewin_nLineRubber(IMWIN* win)
{
if (!win->fLineRubber)
return 0;
else
return list_getDataNum(win->listLineRubber);
}
void imagewin_clearLineRubber(IMWIN* win)
{
if (win->fLineRubber)
{
list_destroy(win->listLineRubber);
win->listLineRubber = NULL;
win->fLineRubber = FALSE;
}
imagewin_updateScr(win);
}
void imagewin_resetLineRubber2(IMWIN* win)
{
if (!win->fLineRubber2)
return;
LIST* list = win->listLineRubber2;
while (!list_isEmpty(list))
{ list_top(list); list_deleteData(list); }
}
void imagewin_addLineRubber2(IMWIN* win,POINT* p1,POINT* p2)
{
if (!win->fLineRubber2)
{
win->fLineRubber2 = TRUE;
win->listLineRubber2 = list_new(sizeof(FRAME));
}
LIST* list = win->listLineRubber2;
FRAME fr;
if (p2 == NULL)
{
list_top(list); FRAME frTop; list_getData(list,&frTop);
fr.X2 = frTop.X;
fr.Y2 = frTop.Y;
}
else
fr.X2 = p2->x, fr.Y2 = p2->y;
fr.X = p1->x, fr.Y = p1->y;
list_moveTo(list, list_getDataNum(list));
list_insertData(list,&fr);
imagewin_updateScr(win);
}
int imagewin_nLineRubber2(IMWIN* win)
{
if (!win->fLineRubber2)
return 0;
else
return list_getDataNum(win->listLineRubber2);
}
void imagewin_clearLineRubber2(IMWIN* win)
{
if (win->fLineRubber2)
{
list_destroy(win->listLineRubber2);
win->listLineRubber2 = NULL;
win->fLineRubber2 = FALSE;
}
imagewin_updateScr(win);
}
/*--------------------------------------------------------*/
/* リサイズ */
/*--------------------------------------------------------*/
int imagewin_resize(IMWIN *win, BOOL fRedraw)
// NOERR, -1(メモリ不足)
{
#define XADD ((2+2) + (BAR_SIZE+2)) /* usr.wid + XADD = win.wid */
#define YADD ((16+2) + (BAR_SIZE+2)) /* usr.ht + YADD = win.ht */
static FRAME frAdj[] =
{
{ 2+2,16+2,-BAR_SIZE-1-2,-BAR_SIZE-1-2 }, // user 領域
{ 1,1,-2,15 }, // タイトルバー
{ 0, -BAR_SIZE, -BAR_SIZE, -1 }, // HSBAR
{ -BAR_SIZE, 16, -1, -BAR_SIZE }, // VSBAR
{ 0,0,0,0 }
};
// pic の大きさにあわせてウィンドウの大きさを制限
if (win->pic != NULL)
{
FRAME fr;
RM_getFrame(win->win, &fr);
int maxwid = win->pic->wid * win->zoom + XADD;
int maxht = win->pic->ht * win->zoom + YADD;
if (fr.X2-fr.X+1 > maxwid)
fr.X2 = fr.X + maxwid - 1;
if (fr.Y2-fr.Y+1 > maxht)
fr.Y2 = fr.Y + maxht - 1;
MMI_SendMessage(win->win, MM_MOVE, 1, &fr);
}
// 各部品を配置
RM_adjustWinUser(win->win, &frAdj[0]);
RM_adjustFrame(win->titlebar, win->win, &frAdj[1]);
RM_adjustFrame(win->sbar_h, win->win, &frAdj[2]);
RM_adjustFrame(win->sbar_v, win->win, &frAdj[3]);
// スクロールバーの更新
FRAME frDisp;
imagewin_getDispFrame(win, &frDisp);
int ofsx,ofsy;
ofsx = RM_getScrollPos(win->sbar_h);
ofsy = RM_getScrollPos(win->sbar_v);
RM_setScrollRange(win->sbar_h, frDisp.WID, win->pic->wid, FALSE);
RM_setScrollRange(win->sbar_v, frDisp.HT, win->pic->ht, FALSE);
ofsx = _min(ofsx, win->pic->wid - frDisp.WID);
ofsy = _min(ofsy, win->pic->ht - frDisp.HT);
RM_setScrollPos(win->sbar_h, ofsx, fRedraw);
RM_setScrollPos(win->sbar_v, ofsy, fRedraw);
if (!fRedraw)
{
// スクロールバーの表示フラグをクリア
MMI_SendMessage(win->sbar_h, MM_ERASE, 0);
MMI_SendMessage(win->sbar_v, MM_ERASE, 0);
}
// 画面出力バッファの再確保★
if (win->bm != NULL)
scrbitmap_delete(win->bm);
FRAME frUser;
RM_getWinUserFrame(win->win, &frUser);
win->bm = scrbitmap_new(frUser.X2-frUser.X+1, frUser.Y2-frUser.Y+1);
if (win->bm == NULL)
return -1;
imagewin_updateBuf(win);
return NOERR;
}
void imagewin_setZoom(IMWIN *win, int zoom)
{
win->zoom = zoom;
WINCLIP* clip;
WIN_beginUpDateObj(win->win, &clip);
imagewin_resize(win, FALSE);
MMI_SendMessage(idBackDialog, MM_SHOW, 0);
MMI_SendMessage(win->win, MM_SHOW, 0);
WIN_endUpDateObj(clip);
}
void imagewin_updateTitle(IMWIN *win, BOOL fShow)
// ウィンドウタイトルを更新表示する
{
if (win->fname[0] == 0)
{
strcpy(win->title, "<名称未定>");
}
else
{
char drive[_MAX_DRIVE],dir[_MAX_DIR];
char basename[_MAX_FNAME],ext[_MAX_EXT];
_splitpath(win->fname, drive, dir, basename, ext);
sprintf(win->title, "%s%s%s",drive,basename,ext);
_strupr(win->title);
}
char buf[40];
sprintf(buf, " (%d×%d, %s colors) 倍率:×%d",
win->pic->wid, win->pic->ht,
(win->pic->pixelsize == 16 ? "32K" : "16M"),
win->zoom);
strcat(win->title, buf);
if (fShow)
{
WINCLIP *clip;
WIN_beginUpDateObj(win->titlebar, &clip);
MMI_SendMessage(win->titlemsg, MM_ERASE, 0);
MMI_SendMessage(win->titlebar, MM_SHOW, 0);
MMI_SendMessage(win->erasebtn, MM_SHOW, 0);
MMI_SendMessage(win->titlemsg, MM_SETMSG, 1, win->title);
MMI_SendMessage(win->titlemsg, MM_SHOW, 0);
WIN_endUpDateObj(clip);
}
else
{
MMI_SendMessage(win->titlemsg, MM_SETMSG, 1, win->title);
}
}
void imagewin_setFileName(IMWIN *win, char *fname, BOOL fShow)
{
if (fname == NULL)
win->fname[0] = 0;
else
strncpy(win->fname, fname, _MAX_PATH-1);
imagewin_updateTitle(win, fShow);
}
/*--------------------------------------------------------*/
/* 画像編集 */
/*--------------------------------------------------------*/
static PIC* picUndo = NULL;
static IMWIN* undo_win = NULL;
void imagewin_storeUndo(IMWIN* win)
{
if (picUndo != NULL)
pic_destroy(picUndo);
undo_win = win;
if ((picUndo = pic_dup(win->pic)) == NULL)
{
#if 0
dispAlertMessage("メモリが足りません",
"メモリ不足のため、この描画コマンドはアンドゥすることが"
"できません。ご注意ください");
#endif
}
}
void imagewin_recoverUndo(void)
{
if (undo_win == NULL)
return;
if (picUndo == NULL)
return;
PIC* pic = undo_win->pic;
undo_win->pic = picUndo;
pic_destroy(pic);
picUndo = NULL;
imagewin_updateBuf(undo_win);
imagewin_updateScr(undo_win);
undo_win = NULL;
}
void imagewin_copy(IMWIN* srcwin, FRAME* frSrc, IMWIN* destwin, POINT *ptDest)
{
FRAME frUpdate;
imagewin_storeUndo(destwin);
pic_beginUpDate(destwin->pic);
pic_copy(srcwin->pic, frSrc, destwin->pic, ptDest);
pic_endUpDate(destwin->pic, &frUpdate);
imagewin_updateScrPart(destwin, &frUpdate);
}
void imagewin_copyarea(IMWIN* srcwin,AREA areaSrc,IMWIN* destwin,POINT *ptDest)
{
FRAME frUpdate;
imagewin_storeUndo(destwin);
pic_beginUpDate(destwin->pic);
pic_copyarea(srcwin->pic, areaSrc, destwin->pic, ptDest);
pic_endUpDate(destwin->pic, &frUpdate);
imagewin_updateScrPart(destwin, &frUpdate);
}