From 9e2b8d0058fc4dd14535184a9dcaa6ab9f71d732 Mon Sep 17 00:00:00 2001 From: makki_d Date: Fri, 11 Sep 2015 03:33:38 +0900 Subject: [PATCH] 2003-07-03 --- delogo.rc | 8 +- editdlg.c | 30 +++-- filter.c | 30 ++--- logoscan/abort.cpp | 265 ++++++++++++++++++++++++++++++++++++++++ logoscan/abort.h | 31 +++++ logoscan/filter.cpp | 281 ++++++++++--------------------------------- logoscan/logoscan.rc | 66 +++++++--- logoscan/makefile | 7 +- logoscan/readme.txt | 30 ++--- logoscan/resource.h | 14 ++- logoscan/resultdlg.c | 105 +++++++++++----- logoscan/scanpix.cpp | 13 +- logoscan/scanpix.h | 3 + readme.txt | 4 +- 14 files changed, 576 insertions(+), 311 deletions(-) create mode 100644 logoscan/abort.cpp create mode 100644 logoscan/abort.h diff --git a/delogo.rc b/delogo.rc index cc0b3d1..1fd6d34 100644 --- a/delogo.rc +++ b/delogo.rc @@ -74,7 +74,7 @@ FONT 9, " // VERSION INFO // VS_VIRSION_INFO VERSIONINFO - FILEVERSION 0,0,6,0 + FILEVERSION 0,0,6,1 PRODUCTVERSION 0,0,6 FILEFLAGSMASK 0x3FL FILEFLAGS 0x0L @@ -86,14 +86,14 @@ VS_VIRSION_INFO VERSIONINFO { BLOCK "041103A4" { - VALUE "Comments", "ロゴサンプル提供者募集中\0" +// VALUE "Comments", "ロゴサンプル提供者募集中\0" VALUE "FileDescription", "透過性ロゴ フィルタ Plugin for AviUtl 0.98\0" - VALUE "FileVersion", "0.0.6.0\0" + VALUE "FileVersion", "0.0.6.1\0" VALUE "InternalName", "deLogo\0" VALUE "LegalCopyright", "(C) MakKi\0" VALUE "OriginalFilename", "delogo.aup\0" VALUE "ProductName", "透過性ロゴ フィルタ\0" - VALUE "ProductVersion", "0.0.6\0" + VALUE "ProductVersion", "0.06a\0" } } BLOCK "VarFileInfo" diff --git a/editdlg.c b/editdlg.c index 09a3345..483d363 100644 --- a/editdlg.c +++ b/editdlg.c @@ -17,7 +17,7 @@ static int list_n; // 関数プロトタイプ //---------------------------- void on_wm_initdialog(HWND hdlg); -void on_IDOK(HWND hdlg); +BOOL on_IDOK(HWND hdlg); /*==================================================================== * EditDlgProc() コールバックプロシージャ @@ -34,8 +34,8 @@ BOOL CALLBACK EditDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam) case WM_COMMAND: switch(LOWORD(wParam)){ case IDOK: - on_IDOK(hdlg); - EndDialog(hdlg,LOWORD(wParam)); + if(on_IDOK(hdlg)) + EndDialog(hdlg,LOWORD(wParam)); break; case IDCANCEL: @@ -71,27 +71,41 @@ void on_wm_initdialog(HWND hdlg) * on_IDOK() OKボタン動作 * ロゴ名の変更 *-------------------------------------------------------------------*/ -void on_IDOK(HWND hdlg) +BOOL on_IDOK(HWND hdlg) { LOGO_HEADER *newdata; LOGO_HEADER *olddata; + char newname[LOGO_MAX_NAME]; + int num; + + // 新ロゴ名前 + GetDlgItemText(hdlg,ID_EDIT_NAME,newname,LOGO_MAX_NAME); + // リストボックスを検索 + num = SendDlgItemMessage(owner,IDC_LIST,LB_FINDSTRING,-1,(WPARAM)newname); + if(num!=CB_ERR){ // 同名が見つかった + MessageBox(hdlg,"同名のロゴがあります\n別の名称を設定してください",filter_name,MB_OK|MB_ICONERROR); + return FALSE; + } + olddata = (LOGO_HEADER *)SendDlgItemMessage(owner,IDC_LIST,LB_GETITEMDATA,list_n,0); // メモリ確保 newdata = (LOGO_HEADER *)malloc(LOGO_DATASIZE(olddata)); if(newdata==NULL){ - MessageBox(hdlg,"メモリが足りません",filter_name,MB_OK|MB_ICONERROR); - return; + MessageBox(hdlg,"メモリが確保できませんでした",filter_name,MB_OK|MB_ICONERROR); + return TRUE; } // ロゴデータコピー memcpy(newdata,olddata,LOGO_DATASIZE(olddata)); - // ロゴ名変更 - GetDlgItemText(hdlg,ID_EDIT_NAME,newdata->name,LOGO_MAX_NAME); + // ロゴ名設定 + lstrcpy(newdata->name,newname); // リストボックスを更新 DeleteItem(owner,list_n); InsertItem(owner,list_n,newdata); + + return TRUE; } diff --git a/filter.c b/filter.c index 35fb896..6b0d82a 100644 --- a/filter.c +++ b/filter.c @@ -44,6 +44,8 @@ * 06/12: プレビューの背景色をRGBで指定できるように変更。 * 位置調整が4の倍数のときcreate_adj_exdata()を呼ばないようにした。(0.05) * 06/30: フェードイン・アウトに対応。 (0.06) +* 07/02: ロゴデータを受信できない場合があったのを修正。 +* 07/03: YCbCrの範囲チェックをするようにした。(しないと落ちることがある)(0.06a) * *********************************************************************/ @@ -63,7 +65,7 @@ * →実装完了 * ・ダイアログを表示したまま終了するとエラー吐く * →親ウィンドウをAviUtl本体にすることで終了できなくした -* ・ロゴデータ構造少し変えようかな… 色差要素のビットを半分にするとか。ver0.10でやるか? +* ・ロゴデータ構造少し変えようかな… 色差要素のビットを半分にするとか。 * * 新メモリ管理について:(2003/05/08) * fp->ex_data_ptrにはロゴの名称のみを保存。(7FFDバイトしかプロファイルに保存されず、不具合が生じるため) @@ -117,7 +119,7 @@ unsigned int logodata_n = 0; char ex_data[LOGO_MAX_NAME]; // 拡張データ領域 -static UINT WM_SEND_LOGO_DATA; // ロゴ受信メッセージ +static UINT WM_SEND_LOGO_DATA =0; // ロゴ受信メッセージ //---------------------------- @@ -377,8 +379,8 @@ BOOL func_proc_eraze_logo(FILTER* fp,FILTER_PROC_INFO *fpip,LOGO_HEADER *lgh,int y = lgp->y + fp->track[LOGO_PY]*16; if(dp==LOGO_MAX_DP) dp--; // 0での除算回避 temp = ((double)ptr->y*LOGO_MAX_DP - y*dp) / (LOGO_MAX_DP - dp) +0.5; // 逆算 -// if (temp>4096) temp = 4096; // 範囲チェック -// else if(temp<0) temp = 0; + if (temp>4096 +128) temp = 4096 +128; // 範囲チェック + else if(temp<0 -128) temp = 0 -128; ptr->y = temp; // 色差(青) @@ -387,8 +389,8 @@ BOOL func_proc_eraze_logo(FILTER* fp,FILTER_PROC_INFO *fpip,LOGO_HEADER *lgh,int cb = lgp->cb + fp->track[LOGO_CB]*16; if(dp==LOGO_MAX_DP) dp--; // 0での除算回避 temp = ((double)ptr->cb*LOGO_MAX_DP - cb*dp) / (LOGO_MAX_DP - dp) +0.5; -// if (temp>2048) temp = 2048; // 範囲チェック -// else if(temp<-2048) temp = -2048; + if (temp> 2048+128) temp = 2048 +128; // 範囲チェック + else if(temp<-2048-128) temp = -2048 -128; ptr->cb = temp; // 色差(赤) @@ -397,8 +399,8 @@ BOOL func_proc_eraze_logo(FILTER* fp,FILTER_PROC_INFO *fpip,LOGO_HEADER *lgh,int cr = lgp->cr + fp->track[LOGO_CR]*16; if(dp==LOGO_MAX_DP) dp--; // 0での除算回避 temp = ((double)ptr->cr*LOGO_MAX_DP - cr*dp) / (LOGO_MAX_DP - dp) +0.5; -// if (temp>2048) temp = 2048; // 範囲チェック -// else if(temp<-2048) temp = -2048; + if (temp> 2048+128) temp = 2048 +128; // 範囲チェック + else if(temp<-2048-128) temp = -2048 -128; ptr->cr = temp; } // if画面内 @@ -444,8 +446,8 @@ BOOL func_proc_add_logo(FILTER *fp,FILTER_PROC_INFO *fpip,LOGO_HEADER *lgh,int f dp = dp * fade / LOGO_FADE_MAX; // フェード不透明度 y = lgp->y + fp->track[LOGO_PY]*16; temp = ((double)ptr->y*(LOGO_MAX_DP-dp) + y*dp) / LOGO_MAX_DP +0.5; // ロゴ付加 -// if (temp>4096) temp = 4096; // 範囲チェック -// else if(temp<0) temp = 0; + if (temp>4096 +128) temp = 4096 +128; // 範囲チェック + else if(temp<0 -128) temp = 0 -128; ptr->y = temp; @@ -454,8 +456,8 @@ BOOL func_proc_add_logo(FILTER *fp,FILTER_PROC_INFO *fpip,LOGO_HEADER *lgh,int f dp = dp * fade / LOGO_FADE_MAX; // フェード不透明度 cb = lgp->cb + fp->track[LOGO_CB]*16; temp = ((double)ptr->cb*(LOGO_MAX_DP-dp) + cb*dp) / LOGO_MAX_DP +0.5; -// if (temp> 2048) temp = 2048; // 範囲チェック -// else if(temp<-2048) temp = -2048; + if (temp> 2048+128) temp = 2048 +128; // 範囲チェック + else if(temp<-2048-128) temp = -2048 -128; ptr->cb = temp; // 色差(赤) //pow(2,(double)fp->track[LOGO_CRDP]/128); @@ -463,8 +465,8 @@ BOOL func_proc_add_logo(FILTER *fp,FILTER_PROC_INFO *fpip,LOGO_HEADER *lgh,int f dp = dp * fade / LOGO_FADE_MAX; // フェード不透明度 cr = lgp->cr + fp->track[LOGO_CR]*16; temp = ((double)ptr->cr*(LOGO_MAX_DP-dp) + cr*dp) / LOGO_MAX_DP +0.5; -// if (temp> 2048) temp = 2048; // 範囲チェック -// else if(temp<-2048) temp = -2048; + if (temp> 2048+128) temp = 2048 +128; // 範囲チェック + else if(temp<-2048-128) temp = -2048 -128; ptr->cr = temp; } // if画面内 diff --git a/logoscan/abort.cpp b/logoscan/abort.cpp new file mode 100644 index 0000000..c2f1182 --- /dev/null +++ b/logoscan/abort.cpp @@ -0,0 +1,265 @@ +/*==================================================================== +* 経過表示・中断ダイアログ +* +* 2003 +* 06/22: 中断できるようにしよう!ついでに経過表示もこっちで。 +* 07/02: ようやく完成 +* +*===================================================================*/ +#include +#include +#include "abort.h" +#include "resource.h" +#include "..\filter.h" + + +#define tLOGOX 0 +#define tLOGOY 1 +#define tLOGOW 2 +#define tLOGOH 3 +#define tTHY 4 + + +class XYWH { +public: + short x; + short y; + short w; + short h; + + XYWH(void) + { x=y=w=h=-1; } + XYWH(XYWH& r) + { x=r.x; y=r.y; w=r.w; h=r.h; } + XYWH(int nx,int ny,int nw,int nh) + { x=nx; y=ny; w=nw; h=nh; } +}; + +bool Cal_BGcolor(PIXEL_YC&,PIXEL_YC*,XYWH&,int,int); +int comp_short(const void* x,const void* y); +short med_average(short* s,int n); +void CreateLogoData(AbortDlgParam* p,HWND hdlg);//FILTER* fp,ScanPixel*& sp,void*&); + +/*==================================================================== +* AbortDlgProc() コールバックプロシージャ +*===================================================================*/ +BOOL CALLBACK AbortDlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + const int IDD_TIMER = 4301; + static int examine; // スキャン済み + static int useable; // 有効サンプル + static AbortDlgParam* p; + static bool abort; + + switch(msg){ + case WM_INITDIALOG: + p = (AbortDlgParam*)lParam; + SetTimer(hdlg,IDD_TIMER,1,NULL); + SetDlgItemInt(hdlg,IDC_ALLF,p->e-p->s+1,false); + examine = useable = 0; + abort = false; + break; + + case WM_CLOSE: + EndDialog(hdlg,0); + break; + + + case WM_COMMAND: + switch(LOWORD(wParam)){ + case IDC_ABORT: + abort = true; + break; + } + break; + + case WM_TIMER: // 読み取り開始 + KillTimer(hdlg,IDD_TIMER); + + //----------------------------------------------- ロゴ解析 + try{ + SendDlgItemMessage(hdlg,IDC_PROGRESS,PBM_SETRANGE,0,MAKELPARAM(0,p->e-p->s+1)); + + while(p->s+examine <= p->e && !abort){ + // pump windows message + MSG message; + while(PeekMessage(&message, NULL, 0, 0, PM_REMOVE)){ + TranslateMessage(&message); + DispatchMessage(&message); + } + + SendDlgItemMessage(hdlg,IDC_PROGRESS,PBM_SETPOS,examine,0); + SetDlgItemInt(hdlg,IDC_USEABLE,useable,FALSE); + SetDlgItemInt(hdlg,IDC_EXAMF,examine,FALSE); + + // 画像取得 + PIXEL_YC* pix = p->fp->exfunc->get_ycp_filtering_cache_ex(p->fp,p->editp,p->s+examine,NULL,NULL); + + // 背景平均値計算 + PIXEL_YC bg; + XYWH xywh(p->x,p->y,p->w,p->h); + if(Cal_BGcolor(bg,pix,xywh,p->max_w,p->t)){ + // 単一背景のときサンプルをセットする + useable++; + SendMessage(p->fp->hwnd,WM_SP_DRAWFRAME,0,p->s+examine); + // ロゴサンプルセット + for(int i=0;imax_w + xywh.x+j]; + p->sp[i*xywh.w+j].AddSample(ptr,bg); // X軸:背景 + } + } + } + examine++; + + } // end of while + + // ロゴデータ作成 + CreateLogoData(p,hdlg); + } + catch(const char* str){ + p->errstr = str; + } + EndDialog(hdlg,0); + + break; + } + + return 0; +} + +/*-------------------------------------------------------------------- +* ロゴデータを作成 +*-------------------------------------------------------------------*/ +void CreateLogoData(AbortDlgParam* p,HWND hdlg) +{ + SetDlgItemText(hdlg,IDC_STATUS,"ロゴデータ構築中..."); + + // ロゴヘッダ作成(名称以外) + LOGO_HEADER lgh; + ZeroMemory(&lgh,sizeof(LOGO_HEADER)); + lgh.x = p->x;//fp->track[tLOGOX]; + lgh.y = p->y;//fp->track[tLOGOY]; + lgh.w = p->w;//fp->track[tLOGOW]; + lgh.h = p->h;//fp->track[tLOGOH]; + + // ロゴデータ領域確保 + *p->data = (void*) new char[LOGO_DATASIZE(&lgh)]; + if(p->data==NULL) throw "メモリ確保できませんでした"; + *((LOGO_HEADER*)*p->data) = lgh; // ヘッダコピー + + LOGO_PIXEL* lgp; + lgp = (LOGO_PIXEL*) ((LOGO_HEADER*)*p->data+1); + + SendDlgItemMessage(hdlg,IDC_PROGRESS,PBM_SETRANGE,0,MAKELPARAM(0,lgh.w*lgh.h-1)); + + for(int i=0;isp[i].GetLGP(lgp[i]); + } +} + + +/*-------------------------------------------------------------------- +* 背景色計算 +*-------------------------------------------------------------------*/ +bool Cal_BGcolor(PIXEL_YC& r,PIXEL_YC* pix,XYWH& xywh,int w,int thy) +{ + short* y; // 背景色配列 + short* cb; + short* cr; + int i,n; + + n = 0; + + // (幅+高さ+2)*2 + y = new short[(xywh.w+xywh.h+2)*2]; + cb = new short[(xywh.w+xywh.h+2)*2]; + cr = new short[(xywh.w+xywh.h+2)*2]; + + pix += xywh.x-1 + (xywh.y-1)*w; // X-1,Y-1に移動 + + // 横線(上)合計 + for(i=0;i<=xywh.w+1;i++){ + y[n] = pix->y; + cb[n] = pix->cb; + cr[n] = pix->cr; + n++; + pix++; + } + pix += w - i; // 次の行へ + // 縦線 + for(i=2;i<=xywh.h+1;i++){ + // 左線 + y[n] = pix->y; + cb[n] = pix->cb; + cr[n] = pix->cr; + n++; + // 右線 + y[n] = pix[xywh.w+1].y; + cb[n] = pix[xywh.w+1].cb; + cr[n] = pix[xywh.w+1].cr; + n++; + + pix += w; // 次の行へ + } + // 横線(下)合計 + for(i=0;i<=xywh.w+1;i++){ + y[n] = pix->y; + cb[n] = pix->cb; + cr[n] = pix->cr; + n++; + pix++; + } + + // ソートして真中らへんを平均 + r.y = med_average(y,n); + r.cb = med_average(cb,n); + r.cr = med_average(cr,n); + + bool ret = true; // 返却値 + + // 最小と最大が閾値以上離れている場合、単一色でないと判断 + if((abs(y[0] - y[n-1])>thy*8) || + (abs(cb[0]-cb[n-1])>thy*8) || + (abs(cr[0]-cr[n-1])>thy*8)) + ret = false; + + delete[] y; + delete[] cb; + delete[] cr; + + return ret; +} + +/*-------------------------------------------------------------------- +* short型比較関数(qsort用) +*-------------------------------------------------------------------*/ +int comp_short(const void* x,const void* y) +{ + return (*(const short*)x - *(const short*)y); +} + +/*-------------------------------------------------------------------- +* ソートして真中らへんを平均 +*-------------------------------------------------------------------*/ +short med_average(short* s,int n) +{ + double t =0.0; + int nn =0; + + // ソートする + qsort(s,n,sizeof(short),comp_short); + + // 真中らへんを平均 + for(int i=n/3;i +#include "..\filter.h" +#include "scanpix.h" + + +// 独自ウィンドウメッセージ +#define WM_SP_DRAWFRAME WM_USER+50 +#define WM_SP_SCANFRAME WM_USER+51 + +// 中断ウィンドウ関数 +BOOL CALLBACK AbortDlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam); + + +struct AbortDlgParam { + FILTER* fp; + void* editp; + ScanPixel* sp; + int s,e; + int max_w; + int x,y,w,h,t; + void** data; + const char* errstr; +}; + +#endif diff --git a/logoscan/filter.cpp b/logoscan/filter.cpp index 4b2bcc2..a24744e 100644 --- a/logoscan/filter.cpp +++ b/logoscan/filter.cpp @@ -1,5 +1,5 @@ /********************************************************************* -* ロゴ解析プラグイン ver.β02 +* ロゴ解析プラグイン ver.β03a * * 2003 * 04/06: とりあえず完成。 @@ -21,12 +21,20 @@ * 06/16: エラーメッセージを一部修正 * ロゴ範囲の形に色が変になるバグ修正 * wとhを間違えていたなんて…鬱だ -* 背景が単一色かどうかを内部で判定するようにした。 -* 06/17: 昨日の修正で入れてしまったバグを修正 +* 背景が単一色かどうかを内部で判定するようにした +* 選択範囲内だけを解析するようにした +* 06/17: 昨日の修正で入れてしまったバグを修正 (β03) +* 06/18: 最初のフレームを表示させていると解析できないバグ修正 (β03a) +* 結果ダイアログのプレビュー背景色をRGBで指定するように変更 +* +* [正式版] +* 07/02: 中断できるようにした。 +* このために処理の流れを大幅に変更。 +* 07/03: プロファイルの変更フレームで無限ループになるバグ回避(0.04) * *********************************************************************/ /* TODO: -* ・中断処理付けないとなー +* ・拡大ツール機能(気まぐれバロンさんのアイディア) * * MEMO: * ・背景値計算改善策@:メディアン化してから平均とか @@ -42,13 +50,13 @@ #include "..\\logo.h" #include "scanpix.h" #include "resultdlg.h" - -//#include +#include "abort.h" // ボタン #define ID_SCANBTN 40010 HWND scanbtn; +AbortDlgParam param; short dn_x,dn_y; // マウスダウン座標 short up_x,up_y; // アップ座標 @@ -56,20 +64,6 @@ HWND scanbtn; void *logodata = NULL; // ロゴデータ(解析結果) -class XYWH { -public: - short x; - short y; - short w; - short h; - - XYWH(void) - { x=y=w=h=-1; } - XYWH(XYWH& r) - { x=r.x; y=r.y; w=r.w; h=r.h; } - XYWH(int nx,int ny,int nw,int nh) - { x=nx; y=ny; w=nw; h=nh; } -}; //---------------------------- // プロトタイプ宣言 //---------------------------- @@ -78,16 +72,12 @@ inline void SetXYWH(FILTER* fp,void* editp); inline void SetRange(FILTER* fp,void* editp); void ScanLogoData(FILTER* fp,void* editp); void SetScanPixel(FILTER*,ScanPixel*&,int,int,int,int,void*); -bool Cal_BGcolor(PIXEL_YC&,PIXEL_YC*,XYWH&,int,int); -void CreateLogoData(FILTER* fp,ScanPixel*& sp); -int comp_short(const void* x,const void* y); -static short med_average(short* s,int n); //---------------------------- // FILTER_DLL構造体 //---------------------------- char filter_name[] = "ロゴ解析"; -char filter_info[] = "ロゴ解析プラグイン ver.β03 by MakKi"; +char filter_info[] = "ロゴ解析プラグイン ver 0.04 by MakKi"; #define track_N 5 #if track_N @@ -168,21 +158,19 @@ BOOL func_proc(FILTER *fp,FILTER_PROC_INFO *fpip) if(!fp->exfunc->is_editing(fpip->editp)) return FALSE; - XYWH logo(fp->track[tLOGOX],fp->track[tLOGOY],fp->track[tLOGOW],fp->track[tLOGOH]); - // 範囲外 - if(logo.x==0 || logo.y==0) return FALSE; - if(logo.x+logo.w > fpip->w) return FALSE; - if(logo.y+logo.h > fpip->h) return FALSE; + if(fp->track[tLOGOX]==0 || fp->track[tLOGOY]==0) return FALSE; + if(fp->track[tLOGOX]+fp->track[tLOGOW] > fpip->w) return FALSE; + if(fp->track[tLOGOY]+fp->track[tLOGOH] > fpip->h) return FALSE; PIXEL_YC* ptr; int i; // 枠を書き込む(Tピクセル外側に) // X-1,Y-1に移動 - ptr = fpip->ycp_edit + (logo.x-1) + (logo.y-1) * fpip->max_w; + ptr = fpip->ycp_edit + (fp->track[tLOGOX]-1) + (fp->track[tLOGOY]-1) * fpip->max_w; // 横線(上)ネガポジ - for(i=0;i<=logo.w+1;i++){ + for(i=0;i<=fp->track[tLOGOW]+1;i++){ ptr->y = 4096 - ptr->y; ptr->cb *= -1; ptr->cr *= -1; @@ -190,22 +178,22 @@ BOOL func_proc(FILTER *fp,FILTER_PROC_INFO *fpip) } ptr += fpip->max_w - i; // 縦線 - for(i=1;i<=logo.h;i++){ + for(i=1;i<=fp->track[tLOGOH];i++){ // 左線 ptr->y = 4096 - ptr->y; ptr->cb *= -1; ptr->cr *= -1; // 右線 - if(logo.w>=0){ - ptr[logo.w+1].y = 4096 - ptr[logo.w+1].y; - ptr[logo.w+1].cb *= -1; - ptr[logo.w+1].cr *= -1; + if(fp->track[tLOGOW]>=0){ + ptr[fp->track[tLOGOW]+1].y = 4096 - ptr[fp->track[tLOGOW]+1].y; + ptr[fp->track[tLOGOW]+1].cb *= -1; + ptr[fp->track[tLOGOW]+1].cr *= -1; } ptr += fpip->max_w; } // 横線(下) - if(logo.h>=0){ - for(i=0;i<=logo.w+1;i++){ + if(fp->track[tLOGOH]>=0){ + for(i=0;i<=fp->track[tLOGOW]+1;i++){ ptr->y = 4096 - ptr->y; ptr->cb *= -1; ptr->cr *= -1; @@ -213,8 +201,6 @@ BOOL func_proc(FILTER *fp,FILTER_PROC_INFO *fpip) } } - - return TRUE; } @@ -230,7 +216,7 @@ BOOL func_WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, void * case WM_FILTER_CHANGE_PARAM: SetRange(fp,editp); - return TRUE; + return FALSE; //--------------------------------------------マウスメッセージ case WM_FILTER_MAIN_MOUSE_DOWN: @@ -269,8 +255,10 @@ BOOL func_WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, void * case WM_COMMAND: switch(LOWORD(wparam)){ case ID_SCANBTN: + EnableWindow(hwnd,FALSE); ScanLogoData(fp,editp); - return TRUE; + EnableWindow(hwnd,TRUE); + break; } break; @@ -279,6 +267,11 @@ BOOL func_WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, void * case WM_MOUSEWHEEL: SendMessage(GetWindow(hwnd, GW_OWNER), message, wparam, lparam); break; + + //----------------------------------------------独自メッセージ + case WM_SP_DRAWFRAME: + fp->exfunc->set_frame(editp,lparam); + return TRUE; } return FALSE; @@ -382,8 +375,11 @@ void ScanLogoData(FILTER* fp,void* editp) throw "フィルタを有効にしてください"; // 必要な情報を集める - frame = fp->exfunc->get_frame(editp); + frame = fp->exfunc->get_frame_n(editp); if(!frame) throw "映像が読み込まれていません"; + + frame = fp->exfunc->get_frame(editp); + fp->exfunc->get_select_frame(editp,&start,&end); if(end-start<1) throw "画像の枚数が足りません"; @@ -404,11 +400,8 @@ void ScanLogoData(FILTER* fp,void* editp) if(defname[i]=='.') defname[i] = '\0'; // 2文字目以降の'.'を終端にする wsprintf(defname,"%s %dx%d",defname,w,h); // デフォルトロゴ名作成 - // ScanPixelを設定する + // ScanPixelを設定する+解析・ロゴデータ作成 SetScanPixel(fp,sp,w,h,start,end,editp); - - // 解析・ロゴデータ作成 - CreateLogoData(fp,sp); } catch(const char* str){ MessageBox(fp->hwnd,str,filter_name,MB_OK|MB_ICONERROR); @@ -426,7 +419,6 @@ void ScanLogoData(FILTER* fp,void* editp) sp=NULL; } - SetWindowText(GetWindow(fp->hwnd,GW_OWNER),"解析完了"); // 表示フレームを戻す fp->exfunc->set_frame(editp,frame); @@ -448,186 +440,41 @@ void ScanLogoData(FILTER* fp,void* editp) *-------------------------------------------------------------------*/ void SetScanPixel(FILTER* fp,ScanPixel*& sp,int w,int h,int s,int e,void* editp) { - XYWH xywh(fp->track[tLOGOX],fp->track[tLOGOY],fp->track[tLOGOW],fp->track[tLOGOH]); - // 範囲チェック - if(xywh.w<=0 || xywh.h<=0) + if(fp->track[tLOGOW]<=0 || fp->track[tLOGOH]<=0) throw "領域が指定されていません"; - if( (xywh.x+xywh.w > w-1) || - (xywh.y+xywh.h > h-1) ) + if( (fp->track[tLOGOX]+fp->track[tLOGOW] > w-1) || + (fp->track[tLOGOY]+fp->track[tLOGOH] > h-1) ) throw "領域の一部が画面外です"; // メモリ確保 if(sp) delete[] sp; - sp = new ScanPixel[xywh.w*xywh.h]; // 幅×高さの配列 + ScanPixel::Defbuf = 1024; + sp = new ScanPixel[fp->track[tLOGOW]*fp->track[tLOGOH]]; // 幅×高さの配列 if(sp==NULL) throw "メモリが確保できませんでした"; - char wndtitle[128]; - - for(int i=0;iexfunc->set_frame(editp,n); - wsprintf(wndtitle,"ロゴ解析中... [%d/%d]",n-s+1,e-s+1); - SetWindowText(GetWindow(fp->hwnd,GW_OWNER),wndtitle); - - // 画像取得 - PIXEL_YC* pix = fp->exfunc->get_ycp_filtering_cache_ex(fp,editp,n,NULL,NULL); - - // 背景平均値計算 - PIXEL_YC bg; - - if(Cal_BGcolor(bg,pix,xywh,w,fp->track[tTHY])==false) - // 単一背景でないときサンプルをセットしない - continue; -/* -FILE* file; -file=fopen("logoscan.txt","a"); -fprintf(file,"%d\n",n+1); -fclose(file); -*/ - // ロゴサンプルセット - for(int i=0;iy; - cb[n] = pix->cb; - cr[n] = pix->cr; - n++; - pix++; - } - pix += w - i; // 次の行へ - // 縦線 - for(i=2;i<=xywh.h+1;i++){ - // 左線 - y[n] = pix->y; - cb[n] = pix->cb; - cr[n] = pix->cr; - n++; - // 右線 - y[n] = pix[xywh.w+1].y; - cb[n] = pix[xywh.w+1].cb; - cr[n] = pix[xywh.w+1].cr; - n++; - - pix += w; // 次の行へ - } - // 横線(下)合計 - for(i=0;i<=xywh.w+1;i++){ - y[n] = pix->y; - cb[n] = pix->cb; - cr[n] = pix->cr; - n++; - pix++; - } - - // ソートして真中らへんを平均 - r.y = med_average(y,n); - r.cb = med_average(cb,n); - r.cr = med_average(cr,n); - - bool ret = true; // 返却値 - - // 最小と最大が閾値以上離れている場合、単一色でないと判断 - if((abs(y[0] - y[n-1])>thy*8) || - (abs(cb[0]-cb[n-1])>thy*8) || - (abs(cr[0]-cr[n-1])>thy*8)) - ret = false; - - delete[] y; - delete[] cb; - delete[] cr; - - return ret; -} - -/*-------------------------------------------------------------------- -* ロゴデータを作成 -*-------------------------------------------------------------------*/ -void CreateLogoData(FILTER* fp,ScanPixel*& sp) -{ - // ロゴヘッダ作成(名称以外) - LOGO_HEADER lgh; - ZeroMemory(&lgh,sizeof(LOGO_HEADER)); - lgh.x = fp->track[tLOGOX]; - lgh.y = fp->track[tLOGOY]; - lgh.w = fp->track[tLOGOW]; - lgh.h = fp->track[tLOGOH]; - - // ロゴデータ領域確保 - logodata = (void*) new char[LOGO_DATASIZE(&lgh)]; - if(logodata==NULL) throw "メモリ確保できませんでした"; - *((LOGO_HEADER*)logodata) = lgh; // ヘッダコピー - - LOGO_PIXEL* lgp; - lgp = (LOGO_PIXEL*) ((LOGO_HEADER*)logodata+1); - - for(int i=0;itrack[tLOGOX]; + param.y = fp->track[tLOGOY]; + param.w = fp->track[tLOGOW]; + param.h = fp->track[tLOGOH]; + param.t = fp->track[tTHY]; + param.data = &logodata; + param.errstr = NULL; + + DialogBoxParam(fp->dll_hinst,"ABORT_DLG",GetWindow(fp->hwnd,GW_OWNER),AbortDlgProc,(LPARAM)¶m); + + if(param.errstr) + throw param.errstr; } -/*-------------------------------------------------------------------- -* ソートして真中らへんを平均 -*-------------------------------------------------------------------*/ -static short med_average(short* s,int n) -{ - double t =0.0; - int nn =0; - - // ソートする - qsort(s,n,sizeof(short),comp_short); - // 真中らへんを平均 - for(int i=n/3;i + #include "resource.h" ////////////////////////////////////////////////////////////////////// // 解析結果ダイアログ // -RESULT_DLG DIALOG 0,0, 158,121 -STYLE WS_VISIBLE | WS_POPUP | WS_CAPTION | DS_MODALFRAME | WS_SYSMENU -CAPTION "ロゴ解析結果" -FONT 9, "MS Pゴシック" +RESULT_DLG DIALOG 10,10, 158,121 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ロゴ解析結果" +FONT 9, "MS Pゴシック" { LTEXT "ロゴ名", IDC_TEXT, 8,10,20,9 EDITTEXT IDC_EDIT, 34, 8,115,12 @@ -24,23 +25,60 @@ FONT 9, " GROUPBOX "背景色", IDC_GROUP, 8,90,142,25,WS_VISIBLE - PUSHBUTTON "黒" , IDC_BLACK, 15,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON - PUSHBUTTON "白" , IDC_WHITE, 40,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON - PUSHBUTTON "赤" , IDC_RED, 65,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON - PUSHBUTTON "緑" , IDC_GREEN, 90,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON - PUSHBUTTON "青" , IDC_BLUE, 115,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON + LTEXT "R", IDC_TEXT, 16,101,8,8 + EDITTEXT IDC_RED, 24, 99,30,12, ES_RIGHT|ES_AUTOHSCROLL|ES_NUMBER|WS_TABSTOP + CONTROL "Spin1",IDC_SPINR,"msctls_updown32", + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_SETBUDDYINT | UDS_ARROWKEYS, + 0,0,0,0 + + LTEXT "G", IDC_TEXT, 61,101,8,8 + EDITTEXT IDC_GREEN, 69, 99,30,12, ES_RIGHT|ES_AUTOHSCROLL|ES_NUMBER|WS_TABSTOP + CONTROL "Spin1",IDC_SPING,"msctls_updown32", + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_SETBUDDYINT | UDS_ARROWKEYS, + 0,0,0,0 + + LTEXT "B", IDC_TEXT, 106,101,8,8 + EDITTEXT IDC_BLUE, 114, 99,30,12, ES_RIGHT|ES_AUTOHSCROLL|ES_NUMBER|WS_TABSTOP + CONTROL "Spin1",IDC_SPINB,"msctls_updown32", + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_SETBUDDYINT | UDS_ARROWKEYS, + 0,0,0,0 +// PUSHBUTTON "黒" , IDC_BLACK, 15,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON +// PUSHBUTTON "白" , IDC_WHITE, 40,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON +// PUSHBUTTON "赤" , IDC_RED, 65,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON +// PUSHBUTTON "緑" , IDC_GREEN, 90,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON +// PUSHBUTTON "青" , IDC_BLUE, 115,99,20,14, BS_CENTER|BS_VCENTER|BS_AUTORADIOBUTTON GROUPBOX "", IDC_PANEL, 8,25,100,60,WS_VISIBLE } +////////////////////////////////////////////////////////////////////// +// 経過表示・中断ダイアログ +// +ABORT_DLG DIALOG 20,20, 150,83 +STYLE WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_BORDER +CAPTION "ロゴ解析中..." +FONT 9, "MS Pゴシック" +{ + DEFPUSHBUTTON "中断", IDC_ABORT, 50,63,50,14, BS_CENTER|BS_VCENTER + + LTEXT "フレームをスキャン中...", IDC_STATUS, 10,7, 120,10 + CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER,8,20,133,12 + + RTEXT "0", IDC_EXAMF, 90,35, 20,10 + CTEXT "/", IDC_STATIC, 115,35, 4,10 + RTEXT "0", IDC_ALLF, 119,35, 20,10 + RTEXT "有効サンプル :", IDC_STATIC, 70,48, 45,10 + RTEXT "0", IDC_USEABLE, 119,48, 20,10 +} + ////////////////////////////////////////////////////////////////////// // VERSION INFO // VS_VIRSION_INFO VERSIONINFO - FILEVERSION 0,0,0,3 - PRODUCTVERSION 0,0,0 + FILEVERSION 0,0,4,0 + PRODUCTVERSION 0,0,4 FILEFLAGSMASK 0x3FL FILEFLAGS 0x0L FILEOS VOS__WINDOWS32 @@ -51,14 +89,14 @@ VS_VIRSION_INFO VERSIONINFO { BLOCK "041103A4" { - VALUE "Comments", "beta version\0" +// VALUE "Comments", "beta version\0" VALUE "FileDescription", "ロゴ解析 Plugin for AviUtl 0.98d\0" - VALUE "FileVersion", "β03\0" + VALUE "FileVersion", "0.04\0" VALUE "InternalName", "LogoScan\0" VALUE "LegalCopyright", "(C) MakKi\0" VALUE "OriginalFilename", "logoscan.aup\0" VALUE "ProductName", "ロゴ解析 プラグイン\0" - VALUE "ProductVersion", "β03\0" + VALUE "ProductVersion", "0.04\0" } } BLOCK "VarFileInfo" diff --git a/logoscan/makefile b/logoscan/makefile index 92f74f0..52ad9e0 100644 --- a/logoscan/makefile +++ b/logoscan/makefile @@ -12,7 +12,7 @@ LFLAG = -tWD -e$(EXE) -O1 -O2 RFLAG = EXE = logoscan.auf -OBJ = filter.obj scanpix.obj resultdlg.obj +OBJ = filter.obj scanpix.obj resultdlg.obj abort.obj RES = logoscan.res @@ -23,7 +23,7 @@ $(EXE): $(OBJ) $(RES) $(LN) $(LFLAG) $(OBJ) $(RL) -fe$(EXE) $(RES) -filter.obj: filter.cpp ..\filter.h ..\logo.h scanpix.h resultdlg.h +filter.obj: filter.cpp ..\filter.h ..\logo.h scanpix.h resultdlg.h abort.h $(CC) $(CFLAG) filter.cpp scanpix.obj: scanpix.cpp ..\filter.h ..\logo.h scanpix.h approxim.h @@ -32,6 +32,9 @@ scanpix.obj: scanpix.cpp ..\filter.h ..\logo.h scanpix.h approxim.h resultdlg.obj: resultdlg.c resultdlg.h resource.h ..\filter.h ..\logo.h $(CC) $(CFLAG) resultdlg.c +abort.obj: abort.cpp abort.h resource.h + $(CC) $(CFLAG) abort.cpp + $(RES): logoscan.rc $(RC) $(RFLAG) logoscan.rc diff --git a/logoscan/readme.txt b/logoscan/readme.txt index e5e4747..133820e 100644 --- a/logoscan/readme.txt +++ b/logoscan/readme.txt @@ -1,7 +1,6 @@ ----------------------------------------------------------------------- - ロゴ解析 フィルタ ver β03 by MakKi + ロゴ解析 プラグイン ver 0.04 by MakKi ----------------------------------------------------------------------- -※ このプログラムはβ版です。重大なバグが含まれている可能性があります。 【機能】 @@ -30,12 +29,11 @@ @ ロゴの含まれる画像をAviUtlに読み込みます。ロゴがフェードしている場面は除いてください。 A フィルタを有効にするとマウスと設定ウィンドウのスライダーで画像の範囲を選択できるようになります。 B ロゴが完全に収まるように範囲を選択して、ロゴ解析 ボタンを押します。 - C ロゴ解析中は中断することはできません。 - D 解析が完了すると、ロゴ解析結果ダイアログが表示されます。 - E プレビューを確認し、ロゴの名称を入力します。 - F 送信 ボタンを押すとロゴデータを直接 透過性ロゴ フィルタに渡します。 + C 解析が完了すると、ロゴ解析結果ダイアログが表示されます。 + D プレビューを確認し、ロゴの名称を入力します。 + E 送信 ボタンを押すとロゴデータを直接 透過性ロゴ フィルタに渡します。 保存 ボタンではロゴデータファイル(*.lgd)としてデータを保存します。 - G 閉じるボタンでダイアログを閉じます。 + F 閉じるボタンでダイアログを閉じます。 【注意】 @@ -50,13 +48,17 @@ 【更新履歴】 - 2003/06/17 ver β03 ・エラーメッセージを一部修正 - ・ロゴ範囲の形に色が変わってしまうバグ修正 - ・背景が単一色かどうかを内部で判定するようにした - 2003/05/10 ver β02 ・背景色計算の精度を向上(してたらいいなぁ) - ・解析が255フレームを超えると落ちるバグを修正 - ・ロゴ範囲の最大値を約4倍にした - 2003/04/29 ver β01 ・テスト版公開 + 2003/07/03 ver 0.04 ・正式版公開 + ・ロゴ解析を中断できるようにした + 2003/06/18 ver β03a ・最初のフレームを表示していると解析できないバグ修正 + ・結果ダイアログのプレビュー背景色をRGBで指定するように変更 + 2003/06/17 ver β03 ・エラーメッセージを一部修正 + ・ロゴ範囲の形に色が変わってしまうバグ修正 + ・背景が単一色かどうかを内部で判定するようにした + 2003/05/10 ver β02 ・背景色計算の精度を向上(してたらいいなぁ) + ・解析が255フレームを超えると落ちるバグを修正 + ・ロゴ範囲の最大値を約4倍にした + 2003/04/29 ver β01 ・テスト版公開 mailto:makki_d210@yahoo.co.jp \ No newline at end of file diff --git a/logoscan/resource.h b/logoscan/resource.h index 0bafe9b..da16f7a 100644 --- a/logoscan/resource.h +++ b/logoscan/resource.h @@ -2,6 +2,7 @@ #ifndef ___RESORCE_H #define ___RESORCE_H +// used by resultdlg #define IDC_SAVE 4200 #define IDC_SEND 4201 #define IDC_CLOSE 4202 @@ -9,12 +10,19 @@ #define IDC_PANEL 4204 #define IDC_TEXT 4205 #define IDC_GROUP 4206 - -#define IDC_BLACK 4101 -#define IDC_WHITE 4102 #define IDC_RED 4103 #define IDC_GREEN 4104 #define IDC_BLUE 4105 +#define IDC_SPINR 4106 +#define IDC_SPING 4107 +#define IDC_SPINB 4108 +// used by abortdlg +#define IDC_EXAMF 4211 +#define IDC_ALLF 4212 +#define IDC_USEABLE 4213 +#define IDC_ABORT 4214 +#define IDC_PROGRESS 4215 +#define IDC_STATUS 4216 #endif diff --git a/logoscan/resultdlg.c b/logoscan/resultdlg.c index b78fc2a..200a6aa 100644 --- a/logoscan/resultdlg.c +++ b/logoscan/resultdlg.c @@ -1,8 +1,12 @@ /*==================================================================== * 解析結果ダイアログ resultdlg.cpp -* 最終更新:2003/06/17 +* +* 2003 +* 06/18: 背景色の指定をRGBに変更 +* *===================================================================*/ #include +#include #include "..\filter.h" #include "..\logo.h" #include "resultdlg.h" @@ -19,12 +23,6 @@ PIXEL* pix; // 表示用ビットマップ BITMAPINFO bmi; -const PIXEL_YC yc_black = { 0, 0, 0 }; // 黒 -const PIXEL_YC yc_white = { 4080, 0, 0 }; // 白 -const PIXEL_YC yc_red = { 1220, -688, 2040 }; // 赤 -const PIXEL_YC yc_green = { 2393,-1351,-1707 }; // 緑 -const PIXEL_YC yc_blue = { 467, 2040, -333 }; // 青 - UINT WM_SEND_LOGO_DATA; // ロゴデータ送信メッセージ FILTER* delogofp; // ロゴ消しフィルタFILTER構造体 @@ -37,13 +35,15 @@ BITMAPINFO bmi; // プロトタイプ //---------------------------- static void Wm_initdialog(HWND hdlg); -static void DispLogo(HWND hdlg,const PIXEL_YC ycbg); +static void DispLogo(HWND hdlg); static void idc_save(HWND hdlg); static void ExportLogoData(char *fname,void *data,HWND hdlg); static void SendLogoData(HWND hdlg); +static PIXEL_YC* get_bgyc(HWND hdlg); + /*==================================================================== -* OptDlgProc() コールバックプロシージャ +* ResultDlgProc() コールバックプロシージャ *===================================================================*/ BOOL CALLBACK ResultDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam) { @@ -52,6 +52,10 @@ BOOL CALLBACK ResultDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam) Wm_initdialog(hdlg); break; + case WM_PAINT: + DispLogo(hdlg); + break; + case WM_COMMAND: switch(LOWORD(wParam)){ case IDCANCEL: @@ -69,24 +73,11 @@ BOOL CALLBACK ResultDlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam) break; //--------------------------------背景色設定 - case IDC_BLACK: - DispLogo(hdlg,yc_black); - return TRUE; - - case IDC_WHITE: - DispLogo(hdlg,yc_white); - return TRUE; case IDC_RED: - DispLogo(hdlg,yc_red); - return TRUE; - case IDC_GREEN: - DispLogo(hdlg,yc_green); - return TRUE; - case IDC_BLUE: - DispLogo(hdlg,yc_blue); + DispLogo(hdlg); return TRUE; } break; @@ -108,7 +99,17 @@ static void Wm_initdialog(HWND hdlg) // デフォルトロゴ名セット SetDlgItemText(hdlg,IDC_EDIT,defname); - pix = NULL; + // RGBエディット・スピンのレンジ設定 + SendDlgItemMessage(hdlg,IDC_RED, EM_SETLIMITTEXT, 3,0); + SendDlgItemMessage(hdlg,IDC_GREEN, EM_SETLIMITTEXT, 3,0); + SendDlgItemMessage(hdlg,IDC_BLUE, EM_SETLIMITTEXT, 3,0); + SendDlgItemMessage(hdlg,IDC_SPINR, UDM_SETRANGE, 0, 255); + SendDlgItemMessage(hdlg,IDC_SPING, UDM_SETRANGE, 0, 255); + SendDlgItemMessage(hdlg,IDC_SPINB, UDM_SETRANGE, 0, 255); + + // メモリ確保 + pix = (PIXEL*)VirtualAlloc(NULL,bmi.bmiHeader.biWidth*bmi.bmiHeader.biHeight*sizeof(PIXEL) + ,MEM_RESERVE,PAGE_READWRITE); // ロゴ消しフィルタを探す delogofp = NULL; @@ -119,7 +120,6 @@ static void Wm_initdialog(HWND hdlg) return; } } - // みつからなかった時 delogofp = NULL; EnableWindow(GetDlgItem(hdlg,IDC_SEND),FALSE); // 送信禁止 @@ -128,11 +128,12 @@ static void Wm_initdialog(HWND hdlg) /*-------------------------------------------------------------------- * DispLogo() ロゴを表示 *-------------------------------------------------------------------*/ -static void DispLogo(HWND hdlg,const PIXEL_YC ycbg) +static void DispLogo(HWND hdlg) { LOGO_HEADER *lgh; LOGO_PIXEL *lgp; PIXEL_YC yc; + PIXEL_YC* ycbg; int i,j,t; HDC hdc; HWND panel; @@ -141,6 +142,9 @@ static void DispLogo(HWND hdlg,const PIXEL_YC ycbg) lgh = (LOGO_HEADER*)logodata; + // 背景色取得 + ycbg = get_bgyc(hdlg); + // BITMAPINFO設定 ZeroMemory(&bmi,sizeof(BITMAPINFO)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); @@ -153,7 +157,7 @@ static void DispLogo(HWND hdlg,const PIXEL_YC ycbg) // メモリ再確保 pix = (PIXEL*)VirtualAlloc(pix,bmi.bmiHeader.biWidth*bmi.bmiHeader.biHeight*sizeof(PIXEL) ,MEM_COMMIT,PAGE_READWRITE); - if(pix==NULL){ // メモリ確保失敗 + if(pix==NULL){ MessageBox(hdlg,"メモリが確保できませんでした\nDispLogo()",filter_name,MB_OK|MB_ICONERROR); return; // 何もしない } @@ -164,11 +168,11 @@ static void DispLogo(HWND hdlg,const PIXEL_YC ycbg) for(i=0;ih;i++){ for(j=0;jw;j++){ // 輝度 - yc.y = ((long)ycbg.y*((long)LOGO_MAX_DP-lgp->dp_y) + (long)lgp->y*lgp->dp_y) / LOGO_MAX_DP; + yc.y = ((long)ycbg->y*((long)LOGO_MAX_DP-lgp->dp_y) + (long)lgp->y*lgp->dp_y) / LOGO_MAX_DP; // 色差(青) - yc.cb = ((long)ycbg.cb*((long)LOGO_MAX_DP-lgp->dp_cb) + (long)lgp->cb*lgp->dp_cb) / LOGO_MAX_DP; + yc.cb = ((long)ycbg->cb*((long)LOGO_MAX_DP-lgp->dp_cb) + (long)lgp->cb*lgp->dp_cb) / LOGO_MAX_DP; // 色差(赤) - yc.cr = ((long)ycbg.cr*((long)LOGO_MAX_DP-lgp->dp_cr) + (long)lgp->cr*lgp->dp_cb) / LOGO_MAX_DP; + yc.cr = ((long)ycbg->cr*((long)LOGO_MAX_DP-lgp->dp_cr) + (long)lgp->cr*lgp->dp_cb) / LOGO_MAX_DP; // YCbCr -> RGB dlgfp->exfunc->yc2rgb(&pix[bmi.bmiHeader.biWidth*(lgh->h-1-i)+j],&yc,1); @@ -316,3 +320,44 @@ static void SendLogoData(HWND hdlg) SendMessage(delogofp->hwnd,WM_SEND_LOGO_DATA,(WPARAM)logodata,0); } + +/*-------------------------------------------------------------------- +* get_bgyc() プレビュー背景色を取得 +*-------------------------------------------------------------------*/ +static PIXEL_YC* get_bgyc(HWND hdlg) +{ + static PIXEL_YC bgyc; + BOOL trans; + int t; + PIXEL p; + + // RGB値取得 + t = GetDlgItemInt(hdlg,IDC_BLUE,&trans,FALSE); + if(trans==FALSE) p.b = 0; + else if(t > 255) p.b = 255; + else if(t < 0) p.b = 0; + else p.b = t; + if(t != p.b) + SetDlgItemInt(hdlg,IDC_BLUE ,p.b,FALSE); + + t = GetDlgItemInt(hdlg,IDC_GREEN,&trans,FALSE); + if(trans==FALSE) p.g = 0; + else if(t > 255) p.g = 255; + else if(t < 0) p.g = 0; + else p.g = t; + if(t != p.g) + SetDlgItemInt(hdlg,IDC_GREEN,p.g,FALSE); + + t = GetDlgItemInt(hdlg,IDC_RED,&trans,FALSE); + if(trans==FALSE) p.r = 0; + else if(t > 255) p.r = 255; + else if(t < 0) p.r = 0; + else p.r = t; + if(t != p.r) + SetDlgItemInt(hdlg,IDC_RED ,p.r,FALSE); + + // RGB -> YCbCr + dlgfp->exfunc->rgb2yc(&bgyc,&p,1); + + return &bgyc; +} diff --git a/logoscan/scanpix.cpp b/logoscan/scanpix.cpp index 4a80e1c..53a3dad 100644 --- a/logoscan/scanpix.cpp +++ b/logoscan/scanpix.cpp @@ -24,6 +24,9 @@ #define DP_RANGE 0x3FFF +unsigned int ScanPixel::Defbuf = 512; +#define BUF_ADDSIZE 128; + /*-------------------------------------------------------------------- * RGBtoYCbCr() *-------------------------------------------------------------------*/ @@ -58,7 +61,7 @@ inline T Abs(T x){ *===================================================================*/ ScanPixel::ScanPixel(void) { - bufsize = 32; + bufsize = Defbuf; lst_y = (short*)malloc(bufsize*sizeof(short)); //new short[bufsize]; lst_cb = (short*)malloc(bufsize*sizeof(short)); //new short[bufsize]; lst_cr = (short*)malloc(bufsize*sizeof(short)); //new short[bufsize]; @@ -94,6 +97,8 @@ ScanPixel::~ScanPixel() *===================================================================*/ int ScanPixel::Alloc(unsigned int f) { + if(bufsize==f) return f; + bufsize = f; if(f<=n) n = f-1; @@ -120,7 +125,7 @@ int ScanPixel::Alloc(unsigned int f) int ScanPixel::AddSample(PIXEL_YC& ycp,PIXEL_YC& ycp_bg) { if(n>=bufsize){ // バッファが足りない時サイズ変更 - bufsize += 32; + bufsize += BUF_ADDSIZE; lst_y = (short*)realloc(lst_y, bufsize*sizeof(short)); //new (lst_y) short[bufsize]; lst_cb = (short*)realloc(lst_cb, bufsize*sizeof(short)); //new (lst_cb) short[bufsize]; lst_cr = (short*)realloc(lst_cr, bufsize*sizeof(short)); //new (lst_cr) short[bufsize]; @@ -225,7 +230,7 @@ int ScanPixel::ClearSample(void) { ScanPixel::~ScanPixel(); - bufsize = 32; + bufsize = 128; lst_y = (short*)malloc(bufsize*sizeof(short)); //new short[bufsize]; lst_cb = (short*)malloc(bufsize*sizeof(short)); //new short[bufsize]; lst_cr = (short*)malloc(bufsize*sizeof(short)); //new short[bufsize]; @@ -247,7 +252,7 @@ int ScanPixel::ClearSample(void) *===================================================================*/ int ScanPixel::GetLGP(LOGO_PIXEL& lgp) { - if(n==0) throw NO_SAMPLE; + if(n<=1) throw NO_SAMPLE; double A; double B; diff --git a/logoscan/scanpix.h b/logoscan/scanpix.h index bd07ee0..371cc6c 100644 --- a/logoscan/scanpix.h +++ b/logoscan/scanpix.h @@ -27,6 +27,9 @@ class ScanPixel { unsigned int bufsize; public: + static unsigned int Defbuf; + + ScanPixel(void); ~ScanPixel(); diff --git a/readme.txt b/readme.txt index cb65936..e323109 100644 --- a/readme.txt +++ b/readme.txt @@ -1,5 +1,5 @@ ----------------------------------------------------------------------- - 透過性ロゴ フィルタプラグイン ver0.06 by MakKi + 透過性ロゴ フィルタプラグイン ver0.06a by MakKi ----------------------------------------------------------------------- 【機能】 @@ -107,6 +107,8 @@ 【更新履歴】 + 2003/07/03 ver 0.06a・ロゴデータを受信できない場合があったのを修正 + ・ロゴ名編集で同名に設定できないようにした 2003/06/30 ver 0.06 ・フェードイン/アウトできるようにした 2003/06/12 ver 0.05 ・すこしだけ高速化 ・プレビューの背景色をRGBで指定できるようにした