/* * ***************************************************************** * * * * * Copyright (c) Fast Corporation, 2001 * * * * * * All Rights Reserved. Unpublished rights reserved under * * * the copyright laws of the Japan. * * * * * * The software contained on this media is proprietary to * * * and embodies the confidential technology of Fast * * * Corporation. Possession, use, duplication or * * * dissemination of the software and media is authorized only * * * pursuant to a valid written license from Fast Corporation. * * * * * ***************************************************************** */ /* CSC90X 画像作成ソフト IMAGEDRW.C */ /*[作成者]Y.Nomura */ /* 目的: 関数: 履歴: Ver 1.0 01/08/13 注記: */ /****************************************************** * Include compiler runtime library */ #include #include /****************************************************** * Include CSC90X library */ #include "f_stdlib.h" #include "f_time.h" #include "f_gui.h" #include "f_stdio.h" #include "f_graph.h" #include "f_image.h" #include "f_pinf.h" #include "f_video.h" #include "f_system.h" #include "f_filter.h" #include "f_file.h" #include "f_gray.h" #include "f_bgray.h" #include "f_math.h" #include "f_calip.h" #include "f_affine.h" #include "xx.h" /****************************************************** * 定数の宣言 */ #define INIT_CUR_POS_X 255 #define INIT_CUR_POS_Y 239 #define LANG_N 2 #define MAIN_MENU_N 5 #define MENU_LENGTH_N 7 #define MENU_WIDTH_N 2 #define DISP_COM_TIMEOUT 1000 #define MAIN_MENU 0 #define MANUAL_DRAW_MENU 1 #define END_MENU 2 #define UP_MENU_YS 0 #define UP_MENU_YE 22 #define LOW_MENU_YS 455 #define LOW_MENU_YE 479 #define UL_MENU_1_XS 0 #define UL_MENU_1_XE 99 #define UL_MENU_2_XS 100 #define UL_MENU_2_XE 199 #define UL_MENU_3_XS 200 #define UL_MENU_3_XE 299 #define UL_MENU_4_XS 300 #define UL_MENU_4_XE 399 #define UL_MENU_5_XS 400 #define UL_MENU_5_XE 499 #define MN_MENU_1_XS 0 #define MN_MENU_1_XE 42 #define MN_MENU_2_XS 43 #define MN_MENU_2_XE 84 #define MN_MENU_1_YS 250 #define MN_MENU_1_YE 274 #define MN_MENU_2_YS 275 #define MN_MENU_2_YE 299 #define MN_MENU_3_YS 300 #define MN_MENU_3_YE 324 #define MN_MENU_4_YS 325 #define MN_MENU_4_YE 349 #define MN_MENU_5_YS 350 #define MN_MENU_5_YE 374 #define MN_MENU_6_YS 375 #define MN_MENU_6_YE 399 #define MN_MENU_7_YS 400 #define MN_MENU_7_YE 424 #define HP_MENU_1_YS 108 #define HP_MENU_1_YE 132 #define HP_MENU_2_YS 140 #define HP_MENU_2_YE 164 #define HP_MENU_3_YS 172 #define HP_MENU_3_YE 196 #define HP_MENU_4_YS 204 #define HP_MENU_4_YE 228 #define HP_MENU_5_YS 236 #define HP_MENU_5_YE 260 #define HP_MENU_6_YS 268 #define HP_MENU_6_YE 292 #define HP_MENU_7_YS 300 #define HP_MENU_7_YE 324 #define PAGE_NOTHING 0 #define BOTH_PAGE 1 #define BACK_PAGE_ONLY 2 #define NEXT_PAGE_ONLY 3 #define DSP_COM_PX 10 #define DSP_COM_PY 44 #define DISP_COMMENT 0 #define NODISP_COMMENT 1 #define LOOP 1 #define EXIT 0 #define DO_EXE 1 #define NO_EXE 0 #define MAX_DOT_NO 50 #define BOX_PLOT_NO 5 #define CROSS_PLOT_NO 13 #define VERTICAL_DIR 0 #define HORIZONTAL_DIR 1 #define BOTH_REDUCE_DIR 2 #define NORMAL_SQUARE 0 #define FRAME_SQUARE 1 #define DOUBLE_SQUARE 2 #define NORMAL_CROSS 3 #define NORMAL_CIRCLE 4 #define FRAME_CIRCLE 5 #define AUTO_DRAW_MAX 50 #define FILENAME_SIZE 12 #define ACCESS_BITS 32 #define STR_ACC_BIT 8 #define PROC_MATRIX 3 #define MAIN_HELP 0 #define UPPER_HELP 10 #define LOWER_HELP 20 #define MANUAL_HELP 30 #define AUTO_HELP 40 /****************************************************** * プロトタイプ宣言 */ typedef struct { int x; int y; }ID_CIR; typedef struct { struct COORDINATES_PAIR pnt[5]; }ID_BOX; typedef enum { PAINT_BACK, PAINT_DRAW }dummy1; /****************************************************** * 関数の宣言 */ int main ( void ); extern int message_note ( void ); static void fnMenuDisp ( int ); static void fnNormalMain ( int, int, int ); static void fnCancelMain ( int, int, int ); int fnExecuteMain ( int, int, int ); static void fnCancelManual ( int, int, int ); static void fnExecuteManual ( int, int, int ); static void fnPosiCalc ( struct COORDINATES_PAIR, struct COORDINATES_PAIR *, int, int, int ); static void fnBinToGray ( int, int, int ); static void fnDrwLvMdf ( int, int ); static void fnParaInit ( void ); static void fnSaveLoad ( void ); static void fnSaveImg ( void ); static void fnLoadImg ( void ); static void fnSvLdSet ( void ); static void fnCutSpace ( char *, char * ); #ifdef __CSC902__ static void fnSavePos ( int *, int *, int ); static void fnSaveOverImg ( int, int ); #endif static void fnAScope ( void ); static void fnHelp ( void ); static void fnHelpDisp ( int *, int * ); static void fnHelp00 ( void ); static void fnHelp10 ( void ); static void fnHelp11 ( void ); static void fnHelp12 ( void ); static void fnHelp13 ( void ); static void fnHelp14 ( void ); static void fnHelp15 ( void ); static void fnHelp20 ( void ); static void fnHelp21 ( void ); static void fnHelp22 ( void ); static void fnHelp23 ( void ); static void fnHelp30 ( void ); static void fnHelp31 ( void ); static void fnHelp32 ( void ); static void fnHelp33 ( void ); static void fnHelp34 ( void ); static void fnHelp35 ( void ); static void fnHelp36 ( void ); static void fnHelp37 ( void ); static void fnHelp40 ( void ); static void fnLvAngSet ( int, int *, int *, int * ); int fnReferLv ( void ); static void fnAutoDraw ( void ); static void fnAutoPosi ( int, int, int ); static void fnBoxDraw ( int, int, int, int, int ); static void fnBoxEstab ( ID_BOX *, int ); static void fnBoxAdjst ( ID_BOX *, int, int * ); static void fnBoxReduce ( ID_BOX, ID_BOX *, double, double ); static void fnDaubBox ( ID_BOX, int ); static void fnDaubBoxAt ( int ); static void fnFrameBoxSet ( void ); static void fnLineBox ( int, int, ID_BOX ); static void fnFrameBox ( ID_BOX, int, int ); static void fnFrameBoxAt ( int, int ); static void fnDualSet ( void ); static void fnDualBox ( ID_BOX, int, int ); static void fnDualBoxAt ( int, int ); static void fnCrossWSet ( void ); static void fnCross ( ID_BOX, int, int ); static void fnCrossAt ( int, int ); static void fnCrclWSet ( void ); static void fnCirclDrw ( int, int, int ); static void fnLineWSet ( void ); int fnLineCalc ( int, int, POINT[], double *, double *, double * ); static void fnLineDraw ( int, int ); static void fnOneLine ( int ); static void fnFreeWSet ( void ); static void fnFreeLine ( int ); static void fnGrdLvSet ( void ); static void fnGrdBox ( int, int ); static void fnGrdCircl ( int, int ); static void fnErasWSet ( void ); static void fnEraser ( int ); double fnSpline ( double, double[], double[], double[], int ); static void fnSpline2 ( double, double *, double *, double[], double[], double[], double[], double[], int ); static void fnSpMkTable ( double[], double[], double[], int ); static void fnSpMkTable2 ( double[], double[], double[], double[], double[], int ); static void fnSplineDraw ( int, double[], double[], int, int ); static void fnSpExec ( int ); static void fnGSpln ( int ); static void fnSplnWSet ( void ); static void fnCharSize ( int, char[], int *, int * ); static void fnCharDraw ( int, int, int, int, int, char *, int, int ); static void fnCharactr ( int, int, int, int ); static void fnCharSet ( void ); static void fnImgChng ( void ); static void fnImgRota ( void ); static void fnBackUp ( void ); static void fnImgUndo ( void ); static void fnClear ( int ); /****************************************************** * グローバル宣言 */ ID_BOX tABox[AUTO_DRAW_MAX][AUTO_DRAW_MAX]; ID_CIR tAcir[AUTO_DRAW_MAX][AUTO_DRAW_MAX]; char baSaveNm[FILENAME_SIZE+1]; char baLoadNm[FILENAME_SIZE+1]; static char baStr[70]; int iClsLv; /* クリア濃度レベル */ int iMnlLv; /* 手動描画濃度レベル */ int iAutoLv; /* 自動描画濃度レベル */ int iInnerDblLv; /* 二重矩形内側濃度レベル */ int iOuterDblLv; /* 二重矩形外側濃度レベル */ int iInnerGrdLv; /* グラデーション描画内側濃度レベル */ int iOuterGrdLv; /* グラデーション描画内側濃度レベル */ int iMnlAng; /* 手動描画角度 */ int iMnlAdj; /* 手動描画時の角度調整(ON/OFF) */ int iAutoAng; /* 自動描画角度 */ int iAutoAdj; /* 自動描画時の角度調整(ON/OFF) */ int iAutoXmax; /* 自動描画時のX方向描画数 */ int iAutoYmax; /* 自動描画時のY方向描画数 */ int iAutoForm; /* 自動描画時の描画形状 */ int iSquareW; /* 矩形(枠のみ)描画時の枠幅 */ int iCircleW; /* 円(枠のみ)描画時の枠幅 */ int iTommboW; /* トンボ描画時の線幅 */ int iStLineW; /* 太線(円)描画時の半径 */ int iFrLineW; /* リーハンド描画描画時のドット幅 */ int iSpLineW; /* スプライン曲線描画時のドット幅 */ int iEraserW; /* 消しゴムのドット幅 */ int iRdcDir; /* 二重矩形描画時の縮小方向 */ int iInRatio; /* 二重矩形描画時の内側比率 */ int iAlRatio; /* 二重矩形描画時の全体比率 */ int iFntType; /* 表示指定(NORMAL/反転) */ int iFntSize; /* 文字の拡大率 */ int iFntStep; /* 文字間ステップ */ int iImgSize; /* セーブサイズ(FV902のみ有効) */ int iHorizontal; /* セーブサイズn*m時のXサイズ(FV902のみ有効) */ int iVertical; /* セーブサイズn*m時のYサイズ(FV902のみ有効) */ int iPstNum; /* 拡張画像セーブ時の貼付枚数 */ int iRotAng; /* 画像回転時の回転角 */ int iRotCnX; /* 画像回転時の中心X */ int iRotCnY; /* 画像回転時の中心Y */ int iUndoMem; /* バックアップ用メモリ */ int iChrgMem; /* 画像変換用メモリ */ int iDrawMem; /* 画像描画メモリ */ int iBinMem; /* 描画二値メモリ */ static double SpIpX[MAX_DOT_NO]; /* スプライン:入力座標X */ static double SpIpY[MAX_DOT_NO]; /* スプライン:入力座標Y */ int SpDotNo; /* スプライン:入力点数 */ int SpDrawStep; /* スプライン:ステップ数 */ int iLanguage; /* 言語 */ /****************************************************** * メニュー項目 */ static char *UpperMainMenu[MAIN_MENU_N][LANG_N] = { { " F I L E ", "フ ァ イ ル" }, { "SAVE & LOAD", "SAVE & LOAD" }, { " A SCOPE ", " A スコープ" }, { " H E L P ", " ヘ ル プ " }, { " Q U I T ", " 終 了 " } }; static char *LowerMainMenu[MAIN_MENU_N][LANG_N] = { { "MANUAL DRAW", "手 動 描 画" }, { " AUTO DRAW ", "自 動 描 画" }, { "IMAGECHANGE", "画 像 変 換" }, { " U N D O ", "や り 直 し" }, { "IMAGE CLEAR", " ク リ ア " } }; static char *ManualDrawMenu[MENU_LENGTH_N][MENU_WIDTH_N] = { { " ■ ", " □ " }, { " ● ", " ○ " }, { "[■]", " + " }, { " -- ", "⊂⊃" }, { "Gr●", "Free" }, { "Gr■", "Spln" }, { " A ", "Eras" } }; static char *HelpMenu[8][LANG_N] = { { "UPPER MENU ", " 上段 メニュー " }, { "LOWER MENU ", " 下段 メニュー " }, { "MANUAL DRAW", "手 動 描 画" }, { " AUTO DRAW ", "自 動 描 画" }, { " HELP EXIT ", "ヘルプ 終了" }, { " HELP MAIN ", "メ イ ン " }, { " PAGE BACK ", " 前 ページ " }, { " NEXT PAGE ", " 次 ページ " } }; static char *HelpManualMenu[MENU_LENGTH_N] = { " ■ | □ ", " ● | ○ ", "[■] | + ", " -- | ⊂⊃", "Gr● | Gr■", "Free | Spln", " A | Eras" }; static char *SaveLoadMenu[10][LANG_N] = { { "SAVE&LOAD", "セーブ&ロード" }, { " S A V E ", " セ ー ブ " }, { " L O A D ", " ロ ー ド " }, { " SETTING ", " 設  定 " }, { " SAVE NAME ", "セーブ ファイル名" }, { " LOAD NAME ", "ロード ファイル名" }, { "IMAGE SIZE", "画像 サイズ" }, { "PASTE TIMES", "貼\ 付 回 数" }, { " VERTICAL ", "縦方向 サイズ" }, { "HORIZONTAL ", "横方向 サイズ" } }; static char *SplineMenu[3][LANG_N] = { { "SPLINE SET ", "スプライン 設定" }, { "DRAW WIDTH ", "描 画 半 径" }, { " DRAW STEP ", "描 画 ステップ" } }; static char *SetDoubleSMenu[7][LANG_N] = { { " SETTING ", " 設  定 " }, { "REDUCE DIR", "縮 小 方 向" }, { " IN DENSITY", "内矩形 濃度" }, { "OUT DENSITY", "外矩形 濃度" }, { " INNER ", "内矩形 比率" }, { " ・ ・ ", "   対  " }, { " OUTER ", "外矩形 比率" } }; static char *SetLvAngMenu[4][LANG_N] = { { " SETTING ", " 設 定  " }, { "DENSITY LEV", "濃 度 設 定" }, { "ROTATE ANGL", "回 転 角 " }, { " RT ADJUST ", "角 度 調 整" } }; static char *SetGradLvMenu[3][LANG_N] = { { " SETTING ", " 設  定 " }, { " IN DENSITY", "内 側 濃 度" }, { "OUT DENSITY", "外 側 濃 度" } }; static char *SetDrawCharMenu[7][LANG_N] = { { " SETTING ", " 設  定 " }, { " FONT TYPE ","表\ 示 指 定" }, { " FONT SIZE ", " 拡 大 率 " }, { " STEP SIZE ", "文字間ステップ" } }; static char *ImgChngMenu[2][LANG_N] = { { "CHANGE", "変換" }, { " ROTATION ", "画 像 回 転" } }; static char *RotationMenu[3][LANG_N] = { { "SET", "設定" }, { "ROTA ANGLE", " 回 転 角 " }, { "CENTERPOINT", "中 心 位 置" } }; static char *SetAutoMenu[4][LANG_N] = { { " SETTING ", "描 画 設 定" }, { "NUMBER OF X", "X方向描画数" }, { "NUMBER OF Y", "Y方向描画数" }, { " DRAW TYPE ", "描 画 形 状" } }; /****************************************************** * セレクト項目 */ static char *ReduceDirSelec[LANG_N][3] = { { " Vertical ", "Horizontal", "BothReduce" }, { "縦のみ縮小", "横のみ縮小", "縦横共縮小" } }; static char *FontSelec[LANG_N][2] = { { "NORMAL FONT ", "REVERSE FONT" }, { " 標準表\示 ", " 反転表\示 " } }; #ifdef __CSC902__ static char *ImgSizeSelect[4] = { " 512 * 480 ", "1280 * 1030", "1632 * 1236", " M * N " }; #endif static char *AutoTypeSelec[LANG_N][6] = { { " ■ ", " □ ", "[■]", " + ", " ● ", " ○ " }, { " ■ ", " □ ", "[■]", " + ", " ● ", " ○ " } }; /****************************************************** * コメント項目 */ static char *UpperMainComment[MAIN_MENU_N][LANG_N] = { { "FILE OPERATION", "ファイルの操作が行えます。" }, { " SAVE & LOAD( IMAGE FILE ) ", "画像のセーブとロード" }, { "DISPLAY A_SCOPE IMAGE", "Aスコープを表\示します。" }, { "DISPLAY HELP CONTENTS", "ヘルプを表\示します。" }, { "QUIT AND RETURN 90X SYSTEM", "終了して、90Xシステムに復帰します。" } }; static char *LowerMainComment[MAIN_MENU_N][LANG_N] = { { "EXE:DRAW CANCEL:DRAW SETTING", "左ボタン:描画 右ボタン:描画設定" }, { "EXE:DRAW CANCEL:DRAW SETTING", "左ボタン:描画 右ボタン:描画設定" }, { "IMAGE CHANGE( ROTATION etc )", "画像を変換(回転等)します。" }, { "UNDO (BUT ONLY ONE STEP)", "やり直し(但し現在はONE STEPのみ)" }, { "EXE:CLEAR CANCEL:CLEAR LEVEL", "左ボタン:クリア 右ボタン:クリアレベル " } }; static char *ManualComment[MENU_LENGTH_N * MENU_WIDTH_N][LANG_N] = { { "DRAW SQUARE(PAINT OUT)", "矩形描画(塗りつぶし)" }, { "DRAW SQUARE(R:WIDTH SET)", "矩形描画 (右ボタン:線幅変更)" }, { "DRAW CIRCLE(PAINT OUT)", "円描画(塗りつぶし)" }, { "DRAW CIRCLE(R:WIDTH SET)", "円描画(右ボタン:線幅変更)" }, { "DRAW DOUBLE SQUARE(R:SETTING)", "二重矩形描画(右ボタン:設定変更)" }, { "DRAW CROSS(R:WIDTH SET)", "トンボ描画(右ボタン:線幅変更)" }, { "DRAW LINE(ONLY ONE DOT WIDTH)", "ライン描画" }, { "DRAW LINE(CONNECT CIRCLE)(R:RADIUS SET)", "太線(円)描画(右ボタン:半径変更)" }, { "DRAW GRADATION CIRCLE(R:RADIUS SET)", "円形グラデーション描画(右ボタン:半径変更)" }, { "DRAW FREE HAND(R:DOT WIDTH SET)", "フリーハンド描画(右ボタン:ドット幅変更)" }, { "DRAW GRADATION SQUARE(R:RADIUS SET)", "矩形グラデーション描画(右ボタン:半径変更)" }, { "DRAW SPLINE(R:DOT WIDTH SET)", "スプライン曲線描画(右ボタン:ドット幅変更)" }, { "DRAW CHARACTER(R:CHARA SIZE SET)", "文字描画(右ボタン:文字サイズ変更)" }, { "ERASER FREE HAND(R:DOT WIDTH SET)", "消しゴム(右ボタン:ドット幅変更)" } }; static char *WaitingComment[5][LANG_N] = { { "PLEASE WAIT. NOW SAVING...", "画像セーブ中..." }, { "PLEASE WAIT. NOW LOADING...", "画像ロード中..." }, { "PLEASE WAIT. NOW PAINTING...", "自動描画中です。暫く御待ち下さい。" }, { "                   ", "                  " }, { "PLEASE SET %dTIMES PASTE POSITION", "%d回目の貼\付位置を指定してください" }, }; static char *DisplayComment[2][LANG_N] = { { "RETURN", "戻 る" }, { "DRAW", "描 画" } }; static char *ErrorComment[10][LANG_N] = { { "ERROR", "エラー" }, { "APPOINT AREA REFER TO DENSITY", "濃度参照エリアを指定してください" }, { "GRAY MEMORY ERROR", "グレイメモリ アロケーションエラー" }, { "PUT AN END TO EXECUTE", "処理打ち切り" }, { "PLEASE SET MORE THAN 3 POINT", "3点以上のドット設定が必要です。" }, { " PLEASE SET DRAW POSITION", "文字描画位置を設定してください。" }, { "NOT SET STRING", "文字が設定されていません。" }, { "OUTSIDE THE RANGE OF SETTING AREA", "描画可能\な範囲を指定して下さい。" }, { "SAVE ERROR[ %s ]", "セーブできません[ %s ]" }, { "LOAD ERROR[ %s ]", "ロードできません[ %s ]" } }; /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** メイン ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ int main( void ) { int sts; int xpos; int ypos; int s_xpos; int s_ypos; int MaxStr; int menu_flag; int comment_flag; /* 初期メッセージ表示 */ if( NORMAL_RETURN != message_note() ) return(0); /* パラメタ初期化 */ xpos = INIT_CUR_POS_X; ypos = INIT_CUR_POS_Y; s_xpos = INIT_CUR_POS_X; s_ypos = INIT_CUR_POS_Y; fnParaInit( ); menu_flag = MAIN_MENU; comment_flag = NODISP_COMMENT; /* 入力ビデオ制御 */ Lib_input_video_control( GRAY_PLANE ); /* ビデオ出力表示項目制御 */ Lib_display_control( GRAY_PLANE | LINE_PLANE | CHAR_PLANE ); /* ビデオ表示項目クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); /* カーソル初期化 */ Lib_init_cursor(); Lib_clp_open( ); Lib_clp_set_result_type( 1 ); /* パッドの背景の設定 */ Lib_set_pad_background( ON ); MaxStr = Lib_get_pad_maxstring(); Lib_set_pad_maxstring( 11 ); /* メインメニューの表示 */ fnMenuDisp( menu_flag ); /* マウスカーソルの表示 */ Lib_draw_cursor( INIT_CUR_POS_X, INIT_CUR_POS_Y ); Lib_freeze( NOT_TRANSMIT ); Lib_gray_memory_cls( CURRENT_MEMORY ); Lib_cls( GRAY_PLANE, BLACK_DRAW ); /* グレイメモリのアロケーション */ if ( -1 == (iChrgMem = Lib_alloc_gray_memory( )) || -1 == (iUndoMem = Lib_alloc_gray_memory( )) ) { Lib_display_message( 70, 200, ErrorComment[ 2][iLanguage], ErrorComment[ 3][iLanguage] ); return(0); } else { Lib_gray_memory_cls( iChrgMem ); Lib_gray_memory_cls( iUndoMem ); } Lib_strtetc( 0, DISP_COM_TIMEOUT ); /* メニュー制御 */ for (;;) { sts = 0; /* マウス位置読みとり */ sts = Lib_see_current_position( &xpos, &ypos ); if ( s_xpos != xpos || s_ypos != ypos ) { /* マウス表示位置移動 */ Lib_move_cursor( xpos, ypos ); s_xpos = xpos; s_ypos = ypos; if ( DISP_COMMENT == comment_flag ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); fnMenuDisp( menu_flag ); comment_flag = NODISP_COMMENT; } Lib_strtetc( 0, DISP_COM_TIMEOUT ); } if( CURSOR_EXECUTE == sts ){ if( MANUAL_DRAW_MENU == menu_flag ){ if ( xpos > MN_MENU_1_XS && xpos MN_MENU_1_YS && ypos < MN_MENU_7_YE ) fnExecuteManual( menu_flag, xpos, ypos ); } if( xpos > UL_MENU_1_XS && xpos < UL_MENU_5_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) menu_flag = fnExecuteMain( menu_flag, xpos, ypos ); else if( xpos > UL_MENU_1_XS && xpos < UL_MENU_5_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) menu_flag = fnExecuteMain( menu_flag, xpos, ypos ); if( END_MENU == menu_flag ) break; } else if ( CURSOR_CANCEL == sts ) { if( MANUAL_DRAW_MENU == menu_flag ) { if ( xpos > MN_MENU_1_XS && xpos MN_MENU_1_YS && ypos < MN_MENU_7_YE ) fnCancelManual( menu_flag, xpos, ypos ); } if( xpos > UL_MENU_1_XS && xpos < UL_MENU_5_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) fnCancelMain( menu_flag, xpos, ypos ); else if( xpos > UL_MENU_1_XS && xpos < UL_MENU_5_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) fnCancelMain( menu_flag, xpos, ypos ); } /* 処理振り分け */ else if ( TIME_OUT == Lib_sensetc( 0 ) ) { if ( NODISP_COMMENT == comment_flag ) { fnNormalMain( menu_flag, xpos, ypos ); comment_flag = DISP_COMMENT; } } } Lib_cancetc( 0 ); Lib_free_gray_memory( iChrgMem ); Lib_free_gray_memory( iUndoMem ); Lib_set_pad_maxstring( MaxStr ); /* パッドの背景の設定 */ Lib_set_pad_background( OFF ); Lib_clp_close(); return(0); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** メニューの表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnMenuDisp( MenuNo ) int MenuNo; { int LenNo; /* 日本語/英語表示文字列切替情報取得 */ iLanguage = Lib_get_disp_language(); /* メインメニュー上段の表示 */ Lib_display_key( 0, 0, UpperMainMenu[0][iLanguage], 1 ); Lib_display_key( 100, 0, UpperMainMenu[1][iLanguage], 1 ); Lib_display_key( 200, 0, UpperMainMenu[2][iLanguage], 1 ); Lib_display_key( 300, 0, UpperMainMenu[3][iLanguage], 1 ); Lib_display_key( 400, 0, UpperMainMenu[4][iLanguage], 1 ); /* メインメニュー下段の表示 */ Lib_display_key( 0, 455, LowerMainMenu[0][iLanguage], 1 ); Lib_display_key( 100, 455, LowerMainMenu[1][iLanguage], 1 ); Lib_display_key( 200, 455, LowerMainMenu[2][iLanguage], 1 ); Lib_display_key( 300, 455, LowerMainMenu[3][iLanguage], 1 ); Lib_display_key( 400, 455, LowerMainMenu[4][iLanguage], 1 ); /* メインメニューの各設定値の表示 */ Lib_sprintf( baStr, "%d %d", iMnlLv, iMnlAng ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, 10, 450, baStr ); Lib_sprintf( baStr, "%d %d", iAutoLv, iAutoAng ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, 110, 450, baStr ); Lib_sprintf( baStr, "%d ", iClsLv ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, 410, 450, baStr ); /* 手動描画メニューの表示 */ if( MANUAL_DRAW_MENU == MenuNo ) { for( LenNo = 0; LenNo < MENU_LENGTH_N; LenNo++ ) { Lib_display_key( 0, 250 + (LenNo * 25), ManualDrawMenu[LenNo][0], 1 ); Lib_display_key( 43, 250 + (LenNo * 25), ManualDrawMenu[LenNo][1], 1 ); } /* 手動描画メニューの各設定値の表示 */ Lib_sprintf( baStr, "%d ", iSquareW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 10, MN_MENU_1_YE - 5, baStr ); Lib_sprintf( baStr, "%d ", iCircleW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 10, MN_MENU_2_YE - 5, baStr ); Lib_sprintf( baStr, "%d ", iTommboW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 10, MN_MENU_3_YE - 5, baStr ); Lib_sprintf( baStr, "R%d ", iStLineW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 10, MN_MENU_4_YE - 5, baStr ); Lib_sprintf( baStr, "%d ", iFrLineW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 10, MN_MENU_5_YE - 5, baStr ); Lib_sprintf( baStr, "%d ", iSpLineW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 10, MN_MENU_6_YE - 5, baStr ); Lib_sprintf( baStr, "%d ", iEraserW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 10, MN_MENU_7_YE - 5, baStr ); } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** メニュー押下無し時表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (メインメニュー) * *********** ********* ******* ***** *** */ static void fnNormalMain( menu_flag, xpos, ypos ) int menu_flag; int xpos, ypos; { Lib_box_cls( 0, 26, 511, 44, ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); if( MANUAL_DRAW_MENU == menu_flag ) { /* " ■ "の簡易ヘルプの表示 */ if ( xpos > MN_MENU_1_XS && xpos MN_MENU_1_YS && ypos < MN_MENU_1_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 0][iLanguage] ); /* " □ "の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_1_YS && ypos < MN_MENU_1_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 1][iLanguage] ); /* " ● "の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_2_YS && ypos < MN_MENU_2_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 2][iLanguage] ); /* " ○ "の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_2_YS && ypos < MN_MENU_2_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 3][iLanguage] ); /* "[■]"の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_3_YS && ypos < MN_MENU_3_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 4][iLanguage] ); /* " + "の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_3_YS && ypos < MN_MENU_3_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 5][iLanguage] ); /* " -- "の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_4_YS && ypos < MN_MENU_4_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 6][iLanguage] ); /* "⊂⊃"の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_4_YS && ypos < MN_MENU_4_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 7][iLanguage] ); /* "Gr●"の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_5_YS && ypos < MN_MENU_5_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 8][iLanguage] ); /* "Free"の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_5_YS && ypos < MN_MENU_5_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[ 9][iLanguage] ); /* "Gr■"の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_6_YS && ypos < MN_MENU_6_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[10][iLanguage] ); /* "Spln"の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_6_YS && ypos < MN_MENU_6_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[11][iLanguage] ); /* " A "の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_7_YS && ypos < MN_MENU_7_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[12][iLanguage] ); /* "Eras"の簡易ヘルプの表示 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_7_YS && ypos < MN_MENU_7_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ManualComment[13][iLanguage] ); } /* "フ ァ イ ル"の簡易ヘルプの表示 */ if ( xpos > UL_MENU_1_XS && xpos < UL_MENU_1_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, UpperMainComment[0][iLanguage] ); /* "SAVE & LOAD"の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, UpperMainComment[1][iLanguage] ); /* " A スコープ"の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_3_XS && xpos < UL_MENU_3_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, UpperMainComment[2][iLanguage] ); /* " ヘ ル プ "の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_4_XS && xpos < UL_MENU_4_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, UpperMainComment[3][iLanguage] ); /* " 終 了 "の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_5_XS && xpos < UL_MENU_5_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, UpperMainComment[4][iLanguage] ); /* "手 動 描 画"の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_1_XS && xpos < UL_MENU_1_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, LowerMainComment[0][iLanguage] ); /* "自 動 描 画"の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, LowerMainComment[1][iLanguage] ); /* "画 像 変 換"の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_3_XS && xpos < UL_MENU_3_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, LowerMainComment[2][iLanguage] ); /* "や り 直 し"の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_4_XS && xpos < UL_MENU_4_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, LowerMainComment[3][iLanguage] ); /* " ク リ ア "の簡易ヘルプの表示 */ else if ( xpos > UL_MENU_5_XS && xpos < UL_MENU_5_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, LowerMainComment[4][iLanguage] ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** メニュー取消押下時処理 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (メインメニュー) * *********** ********* ******* ***** *** */ static void fnCancelMain( menu_flag, xpos, ypos ) int menu_flag; int xpos, ypos; { /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); /* "手 動 描 画"の設定 */ if ( xpos > UL_MENU_1_XS && xpos < UL_MENU_1_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) { /* 設定(描画濃度、描画角度、角度調整のON/OFF) */ fnLvAngSet( PAINT_DRAW, &iMnlLv, &iMnlAng, &iMnlAdj ); /* 設定濃度値の表示 */ Lib_sprintf( baStr, "%d %d", iMnlLv, iMnlAng ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, 10, 450, baStr ); } /* "自 動 描 画"の設定 */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) { /* 設定(描画濃度、描画角度、角度調整のON/OFF) */ fnLvAngSet( PAINT_DRAW, &iAutoLv, &iAutoAng, &iAutoAdj ); /* 設定濃度値の表示 */ Lib_sprintf( baStr, "%d %d", iAutoLv, iAutoAng ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, 110, 450, baStr ); } /* " ク リ ア "の設定 */ else if ( xpos > UL_MENU_5_XS && xpos < UL_MENU_5_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) { /* 濃度設定 */ iClsLv = (int)Lib_get_value_by_ten_keyboad( 20, 100, iClsLv, 0, 255 ); /* 設定濃度値の表示 */ Lib_sprintf( baStr, "%d ", iClsLv ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, 210, 450, baStr ); } /* メニュの表示 */ fnMenuDisp( menu_flag ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** メニュー実行押下時処理 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (メインメニュー) * *********** ********* ******* ***** *** */ int fnExecuteMain( menu_flag, xpos, ypos ) int menu_flag; int xpos, ypos; { /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); /* ファイル */ if ( xpos > UL_MENU_1_XS && xpos < UL_MENU_1_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) Lib_system_process( FILE_MENU ); /* セーブ&ロード */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) fnSaveLoad( ); /* Aスコープ */ else if ( xpos > UL_MENU_3_XS && xpos < UL_MENU_3_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) fnAScope( ); /* ヘルプ */ else if ( xpos > UL_MENU_4_XS && xpos < UL_MENU_4_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) fnHelp( ); /* 終 了 */ else if ( xpos > UL_MENU_5_XS && xpos < UL_MENU_5_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) return( END_MENU ); /* 自動描画 */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) fnAutoDraw( ); /* 画像変換 */ else if ( xpos > UL_MENU_3_XS && xpos < UL_MENU_3_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) fnImgChng( ); /* やり直し */ else if ( xpos > UL_MENU_4_XS && xpos < UL_MENU_4_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) fnImgUndo( ); /* クリア */ else if ( xpos > UL_MENU_5_XS && xpos < UL_MENU_5_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) fnClear( iClsLv ); /* 手動描画メニュー表示 */ if ( xpos > UL_MENU_1_XS && xpos < UL_MENU_1_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) { fnMenuDisp( MANUAL_DRAW_MENU ); return( MANUAL_DRAW_MENU ); } /* 前のままメニュー表示 */ else if ( xpos > UL_MENU_3_XS && xpos < UL_MENU_5_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) { fnMenuDisp( menu_flag ); return( menu_flag ); } /* 手動描画メニュー非表示 */ else { fnMenuDisp( MAIN_MENU ); return( MAIN_MENU ); } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** メニュー取消押下時処理 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (手動描画メニュー) * *********** ********* ******* ***** *** */ static void fnCancelManual( menu_flag, xpos, ypos ) int menu_flag; int xpos, ypos; { /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); /* " □ "の設定 */ if ( xpos > MN_MENU_2_XS && xpos MN_MENU_1_YS && ypos < MN_MENU_1_YE ) fnFrameBoxSet( ); /* " ○ "の設定 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_2_YS && ypos < MN_MENU_2_YE ) fnCrclWSet( ); /* "[■]"の設定 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_3_YS && ypos < MN_MENU_3_YE ) fnDualSet( ); /* " + "の設定 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_3_YS && ypos < MN_MENU_3_YE ) fnCrossWSet( ); /* "⊂⊃"の設定 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_4_YS && ypos < MN_MENU_4_YE ) fnLineWSet( ); /* "Gr●"の設定 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_5_YS && ypos < MN_MENU_5_YE ) fnGrdLvSet( ); /* "Free"の設定 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_5_YS && ypos < MN_MENU_5_YE ) fnFreeWSet( ); /* "Gr■"の設定 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_6_YS && ypos < MN_MENU_6_YE ) fnGrdLvSet( ); /* "Spln"の設定 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_6_YS && ypos < MN_MENU_6_YE ) fnSplnWSet( ); /* " A "の設定 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_7_YS && ypos < MN_MENU_7_YE ) fnCharSet( ); /* "Eras"の設定 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_7_YS && ypos < MN_MENU_7_YE ) fnErasWSet( ); /* メニュの表示 */ fnMenuDisp( menu_flag ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** メニュー実行押下時処理 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (手動描画メニュー) * *********** ********* ******* ***** *** */ static void fnExecuteManual( menu_flag, xpos, ypos ) int menu_flag; int xpos, ypos; { /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); /* " ■ "描画 */ if ( xpos > MN_MENU_1_XS && xpos MN_MENU_1_YS && ypos < MN_MENU_1_YE ) fnBoxDraw( NORMAL_SQUARE, iMnlLv, iSquareW, iMnlAng, iMnlAdj ); /* " □ "描画 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_1_YS && ypos < MN_MENU_1_YE ) fnBoxDraw( FRAME_SQUARE, iMnlLv, iSquareW, iMnlAng, iMnlAdj ); /* " ● "描画 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_2_YS && ypos < MN_MENU_2_YE ) fnCirclDrw( ON, iMnlLv, iCircleW ); /* " ○ "描画 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_2_YS && ypos < MN_MENU_2_YE ) fnCirclDrw( OFF, iMnlLv, iCircleW ); /* "[■]"描画 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_3_YS && ypos < MN_MENU_3_YE ) fnBoxDraw( DOUBLE_SQUARE, iMnlLv, iSquareW, iMnlAng, iMnlAdj ); /* " + "描画 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_3_YS && ypos < MN_MENU_3_YE ) fnBoxDraw( NORMAL_CROSS, iMnlLv, iTommboW, iMnlAng, iMnlAdj ); /* " -- "描画 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_4_YS && ypos < MN_MENU_4_YE ) fnOneLine( iMnlLv ); /* "⊂⊃"描画 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_4_YS && ypos < MN_MENU_4_YE ) fnLineDraw( iMnlLv, iStLineW ); /* "Gr●"描画 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_5_YS && ypos < MN_MENU_5_YE ) fnGrdCircl( iInnerGrdLv, iOuterGrdLv ); /* "Free"描画 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_5_YS && ypos < MN_MENU_5_YE ) fnFreeLine( iFrLineW ); /* "Gr■"描画 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_6_YS && ypos < MN_MENU_6_YE ) fnGrdBox( iInnerGrdLv, iOuterGrdLv ); /* "Spln"描画 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_6_YS && ypos < MN_MENU_6_YE ) fnGSpln( iSpLineW ); /* " A "描画 */ else if ( xpos > MN_MENU_1_XS && xpos MN_MENU_7_YS && ypos < MN_MENU_7_YE ) fnCharactr( iFntType, iFntSize, iFntStep, iMnlLv ); /* "Eras"描画 */ else if ( xpos > MN_MENU_2_XS && xpos MN_MENU_7_YS && ypos < MN_MENU_7_YE ) fnEraser( iEraserW ); /* メニュの表示 */ fnMenuDisp( menu_flag ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** アライメント後の位置算出 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnPosiCalc( Ante, Post, midX, midY, angle ) struct COORDINATES_PAIR Ante; /* 入力数値 */ struct COORDINATES_PAIR *Post; /* 出力数値 */ int midX; /* 中心のX値 */ int midY; /* 中心のY値 */ int angle; /* 回転角(度) */ { double dAnteCX, dAnteCY; /* 入力数値(double型) */ double dMidCX, dMidCY; /* 変換係数(double型) */ double dPostCX, dPostCY; /* 出力数値(double型) */ double AnteR, PostR; /* 中心との各角(入出力) */ dAnteCX = (double)Ante.x; dAnteCY = (double)Ante.y; /* 位置の計算 */ AnteR = atan2( ( Ante.y - midY ), ( Ante.x - midX ) ); PostR = AnteR + ( (double)angle * 3.14159 ) / 180; dMidCX = dAnteCX * cos( AnteR ) + dAnteCY * sin( AnteR ) - midX * cos( AnteR ) - midY * sin( AnteR ); dMidCY = -dAnteCX * sin( AnteR ) + dAnteCY * cos( AnteR ) + midX * sin( AnteR ) - midY * cos( AnteR ); dPostCX = dMidCX * cos( PostR ) - dMidCY * sin( PostR ) + midX; dPostCY = dMidCX * sin( PostR ) + dMidCY * cos( PostR ) + midY; Post->x = XXd4i5_d( dPostCX ); Post->y = XXd4i5_d( dPostCY ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** BMの白をGMへ指定濃度で書込 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnBinToGray( src_mem_no, dst_mem_no, level ) int src_mem_no; int dst_mem_no; int level; { register int i, a; int size_x, size_y; int bloc; int d; int *bbase, *wb; char *gbase, *wg; /* 先頭アドレスの取得 */ bbase = (void *)Lib_adrs_bin_memory( src_mem_no ); gbase = (void *)Lib_adrs_gray_memory( dst_mem_no ); /* 画像サイズ取得 */ size_x = Lib_get_fx_size( ); size_y = Lib_get_fy_size( ); /* ブロック数の計算 */ bloc = size_x * size_y / ACCESS_BITS; /* ブロック移動 */ for ( i=0; i> a ); if ( 0 != d ) { *wg = level; } /* グレイメモリのアドレスを一つ */ wg++; } } bbase++; gbase += ACCESS_BITS; } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 描画濃度レベル更新 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnDrwLvMdf( xpos, ypos ) int xpos, ypos; { int dx; int sum; int i, a; int xs, ys; char *wb2; char *base; char *wind_base; sum = 0; /* 現在位置の取得 */ xs = xpos - 1; ys = ypos - 1; /* 画面サイズの取得 */ dx = Lib_get_dx_size(); /* グレイメモリの先頭アドレス */ base = Lib_adrs_gray_memory( iDrawMem ); /* 指定位置のアドレスを取得 */ wind_base = base + (ys*dx) + xs; /* 指定位置周辺の濃度平均の取得 */ for ( i=0; i UL_MENU_1_XS && xpos < UL_MENU_1_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) MenuNo = UPPER_HELP; /* 下段ヘルプ */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) MenuNo = LOWER_HELP; /* 手動描画ヘルプ */ else if ( xpos > UL_MENU_3_XS && xpos < UL_MENU_3_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) MenuNo = MANUAL_HELP; /* 自動描画ヘルプ */ else if ( xpos > UL_MENU_4_XS && xpos < UL_MENU_4_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) MenuNo = AUTO_HELP; /* ヘルプ終了 */ else if ( xpos > UL_MENU_5_XS && xpos < UL_MENU_5_XE && ypos > UP_MENU_YS && ypos < UP_MENU_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); break; } if ( UPPER_HELP == MenuNo || LOWER_HELP == MenuNo || MANUAL_HELP == MenuNo ) { /* ヘルプメニュー1を選択 */ if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > HP_MENU_1_YS && ypos < HP_MENU_1_YE ) MenuNo += 1; /* ヘルプメニュー2を選択 */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > HP_MENU_2_YS && ypos < HP_MENU_2_YE ) MenuNo += 2; /* ヘルプメニュー3を選択 */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > HP_MENU_3_YS && ypos < HP_MENU_3_YE ) MenuNo += 3; } if ( UPPER_HELP == MenuNo || MANUAL_HELP == MenuNo ) { /* ヘルプメニュー4を選択 */ if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > HP_MENU_4_YS && ypos < HP_MENU_4_YE ) MenuNo += 4; /* ヘルプメニュー5を選択 */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > HP_MENU_5_YS && ypos < HP_MENU_5_YE ) MenuNo += 5; } if ( MANUAL_HELP == MenuNo ) { /* ヘルプメニュー6を選択 */ if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > HP_MENU_6_YS && ypos < HP_MENU_6_YE ) MenuNo += 6; /* ヘルプメニュー7を選択 */ else if ( xpos > UL_MENU_2_XS && xpos < UL_MENU_2_XE && ypos > HP_MENU_7_YS && ypos < HP_MENU_7_YE ) MenuNo += 7; } /* ヘルプメインへ */ if ( MAIN_HELP != MenuNo ) { if ( xpos > UL_MENU_1_XS && xpos < UL_MENU_1_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) MenuNo = MAIN_HELP; } /* 前ページへ */ if ( BOTH_PAGE == iPage || BACK_PAGE_ONLY == iPage ) { if ( xpos > UL_MENU_3_XS && xpos < UL_MENU_3_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) MenuNo--; } /* 次ページへ */ if ( BOTH_PAGE == iPage || NEXT_PAGE_ONLY == iPage ) { if ( xpos > UL_MENU_4_XS && xpos < UL_MENU_4_XE && ypos > LOW_MENU_YS && ypos < LOW_MENU_YE ) MenuNo++; } /* 表示ページ番号変更時に表示変更 */ if ( StMenuNo != MenuNo ) { fnHelpDisp( &MenuNo, &iPage ); StMenuNo = MenuNo; } } } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelpDisp( MenuNo, iPage ) int *MenuNo; int *iPage; { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); switch( *MenuNo ) { case 0: *iPage = PAGE_NOTHING; /* メイン */ fnHelp00( ); break; case 10: *iPage = NEXT_PAGE_ONLY; /* 上段メニュー */ fnHelp10( ); break; case 11: *iPage = BOTH_PAGE; /* ファイル */ fnHelp11( ); break; case 12: *iPage = BOTH_PAGE; /* SAVE&LOAD */ fnHelp12( ); break; case 13: *iPage = BOTH_PAGE; /* Aスコープ */ fnHelp13( ); break; case 14: *iPage = BOTH_PAGE; /* ヘルプ */ fnHelp14( ); break; case 15: *iPage = BACK_PAGE_ONLY; /* 終了 */ fnHelp15( ); break; case 20: *iPage = NEXT_PAGE_ONLY; /* 下段メニュー */ fnHelp20( ); break; case 21: *iPage = BOTH_PAGE; /* 画像変換 */ fnHelp21( ); break; case 22: *iPage = BOTH_PAGE; /* やり直し */ fnHelp22( ); break; case 23: *iPage = BACK_PAGE_ONLY; /* クリア */ fnHelp23( ); break; case 30: *iPage = NEXT_PAGE_ONLY; /* 手動描画 */ fnHelp30( ); break; case 31: *iPage = BOTH_PAGE; /* 矩形 */ fnHelp31( ); break; case 32: *iPage = BOTH_PAGE; /* 丸 */ fnHelp32( ); break; case 33: *iPage = BOTH_PAGE; /* 変形 */ fnHelp33( ); break; case 34: *iPage = BOTH_PAGE; /* ライン1 */ fnHelp34( ); break; case 35: *iPage = BOTH_PAGE; /* ライン2 */ fnHelp35( ); break; case 36: *iPage = BOTH_PAGE; /* グラデーション */ fnHelp36( ); break; case 37: *iPage = BACK_PAGE_ONLY; /* 文字と、消しゴム */ fnHelp37( ); break; case 40: *iPage = PAGE_NOTHING; /* 自動描画 */ fnHelp40( ); break; default: break; } /* ヘルプメニューの表示(上段) */ Lib_display_key( UL_MENU_1_XS, UP_MENU_YS, HelpMenu[0][iLanguage], 1 ); Lib_display_key( UL_MENU_2_XS, UP_MENU_YS, HelpMenu[1][iLanguage], 1 ); Lib_display_key( UL_MENU_3_XS, UP_MENU_YS, HelpMenu[2][iLanguage], 1 ); Lib_display_key( UL_MENU_4_XS, UP_MENU_YS, HelpMenu[3][iLanguage], 1 ); Lib_display_key( UL_MENU_5_XS, UP_MENU_YS, HelpMenu[4][iLanguage], 1 ); /* ヘルプメニューの表示(下段) */ if ( MAIN_HELP != MenuNo ) Lib_display_key( UL_MENU_1_XS, LOW_MENU_YS, HelpMenu[5][iLanguage], 1 ); if ( BOTH_PAGE == *iPage || BACK_PAGE_ONLY == *iPage ) Lib_display_key( UL_MENU_3_XS, LOW_MENU_YS, HelpMenu[6][iLanguage], 1 ); if ( BOTH_PAGE == *iPage || NEXT_PAGE_ONLY == *iPage ) Lib_display_key( UL_MENU_4_XS, LOW_MENU_YS, HelpMenu[7][iLanguage], 1 ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** メインヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp00( ) { #ifdef __CSC902__ Lib_chrdisp( 5, 5, "【機能\概要】 IMAGEDRW.EXE " ); #elif defined __CSC903__ Lib_chrdisp( 5, 5, "【機能\概要】 IMAGEDRW.903 " ); #elif defined __CSC904__ Lib_chrdisp( 5, 5, "【機能\概要】 IMAGEDRW.904 " ); #else Lib_chrdisp( 5, 5, "【機能\概要】 IMAGEDRW.BIN " ); #endif Lib_chrdisp( 8, 8, "本ソ\フトウェアはテスト画像(濃淡)作成ツールです。" ); Lib_chrdisp( 8, 12, "○ ここでは各描画機能\を説明します。上段にキーが" ); Lib_chrdisp( 8, 14, " 設置してありますので、説明が必要な機能\の属する" ); Lib_chrdisp( 8, 16, " キーを押下してください。" ); Lib_chrdisp( 8, 20, "○ 通常画面での簡易ヘルプはヘルプが必要なメニュ" ); Lib_chrdisp( 8, 22, " 上同位置に、カーソ\ルを一秒以上静止させることで" ); Lib_chrdisp( 8, 24, " 左上のメニュ下に表\示されます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 上段メニューヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp10( ) { Lib_display_key( UL_MENU_2_XS, HP_MENU_1_YS, UpperMainMenu[0][iLanguage], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_2_YS, UpperMainMenu[1][iLanguage], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_3_YS, UpperMainMenu[2][iLanguage], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_4_YS, UpperMainMenu[3][iLanguage], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_5_YS, UpperMainMenu[4][iLanguage], 1 ); Lib_chrdisp( 5, 5, "<上段メニュー>" ); Lib_chrdisp( 27, 8, "--- ファイル" ); Lib_chrdisp( 27, 10, "--- SAVE & LOAD" ); Lib_chrdisp( 27, 12, "--- A スコープ" ); Lib_chrdisp( 27, 14, "--- ヘルプ" ); Lib_chrdisp( 27, 16, "--- 終了" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** ファイルヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp11( ) { Lib_chrdisp( 5, 5, "<ファイル>" ); Lib_chrdisp( 8, 10, "  90Xシリーズ標準機能\の『ファイル』と同動作" ); Lib_chrdisp( 8, 12, " が行えます。ファイルの削除、ファイル名変更等が" ); Lib_chrdisp( 8, 14, " 行えます。" ); Lib_chrdisp( 8, 20, "○現在実行中の[IMAGEDRW.EXE]は削除しないで下さい" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** SAVE&LOADヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp12( ) { Lib_chrdisp( 5, 5, "<SAVE & LOAD>" ); Lib_chrdisp( 8, 7, "[セーブ] -- セーブを行います.サイズは(512 * 480)" ); #ifdef __CSC902__ Lib_chrdisp( 8, 8, "       (1280 * 1030)(1632 * 1236)(m * n)" ); #endif Lib_chrdisp( 8, 10, "[ロード] -- ロードを行います。対象画像ファイル" ); Lib_chrdisp( 8, 11, "         サイズは(512*480)となります。" ); Lib_chrdisp( 8, 13, "[設 定] -- セーブ,ロードの設定が行えます。" ); Lib_chrdisp( 8, 15, " [セーブファイル名] -- セーブファイル名の設定" ); Lib_chrdisp( 8, 16, "         (同ファイル名がある場合は上書)" ); Lib_chrdisp( 8, 18, " [ロードファイル名] -- ロードファイル名の設定 (512 * 480)" ); Lib_chrdisp( 8, 19, "         ファイル名[LIVE]でカメラ入力します" ); #ifdef __CSC902__ Lib_chrdisp( 8, 21, " [ 画像サイズ ] -- セーブ画像サイズの設定" ); Lib_chrdisp( 8, 23, " [ 貼\付回数 ] -- セーブ時の作成画像貼\付枚数の" ); Lib_chrdisp( 8, 24, "             設定(512*480以外で有効)" ); Lib_chrdisp( 8, 26, " [縦方向サイズ] -- 縦方向サイズ (m*n選択時のみ有効)" ); Lib_chrdisp( 8, 28, " [横方向サイズ] -- 横方向サイズ (m*n選択時のみ有効)" ); #endif } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** Aスコープヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp13( ) { Lib_chrdisp( 5, 5, "<Aスコープ>" ); Lib_chrdisp( 8, 10, "Aスコープを表\示します。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp14( ) { Lib_chrdisp( 5, 5, "<ヘルプ>" ); Lib_chrdisp( 8, 10, "ヘルプを表\示します。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 終了ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp15( ) { Lib_chrdisp( 5, 5, "<終了>" ); Lib_chrdisp( 8, 10, "終了して90Xシステムに戻ります。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 下段メニューヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp20( ) { Lib_display_key( UL_MENU_2_XS, HP_MENU_1_YS, LowerMainMenu[2][iLanguage], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_2_YS, LowerMainMenu[3][iLanguage], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_3_YS, LowerMainMenu[4][iLanguage], 1 ); Lib_chrdisp( 5, 5, "<下段メニュー>" ); Lib_chrdisp( 27, 8, "--- 画像変換" ); Lib_chrdisp( 27, 10, "--- やり直し" ); Lib_chrdisp( 27, 12, "--- クリア" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 画像変換ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp21( ) { Lib_chrdisp( 5, 5, "<画像変換> -- 画像全体に対して何らかの処理を行います" ); Lib_chrdisp( 8, 8, "[画像回転] ---- 画像全体を回転させます。" ); Lib_chrdisp( 8, 10, " [回 転 角] -- 回転角を十\倍値で設定( 0〜 3600 )" ); Lib_chrdisp( 8, 12, " [中心位置] -- 回転中心の設定" ); Lib_chrdisp( 8, 16, " ○ 実行を押下すると画像を回転させます。" ); Lib_chrdisp( 8, 20, "   回転させない場合は取消キーを押下します。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** やり直しヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp22( ) { Lib_chrdisp( 5, 5, "<やり直し>" ); Lib_chrdisp( 8, 10, " 画像描画のやり直しがワンステップのみ行えます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** クリアヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp23( ) { Lib_chrdisp( 5, 5, "<ク リ ア> -- 実行キー(左: 赤 ):クリアします。" ); Lib_chrdisp( 5, 6, "       -- 取消キー(右:オレンジ):クリア濃度の設定。" ); Lib_chrdisp( 8, 10, "実行キー(左:赤)を押下することで全面クリアします。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 手動描画ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp30( ) { Lib_display_key( UL_MENU_2_XS, HP_MENU_1_YS, HelpManualMenu[0], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_2_YS, HelpManualMenu[1], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_3_YS, HelpManualMenu[2], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_4_YS, HelpManualMenu[3], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_5_YS, HelpManualMenu[4], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_6_YS, HelpManualMenu[5], 1 ); Lib_display_key( UL_MENU_2_XS, HP_MENU_7_YS, HelpManualMenu[6], 1 ); Lib_chrdisp( 5, 5, "<手動描画>-- 実行キー(左: 赤 ):手動描画パッドの表\示" ); Lib_chrdisp( 5, 6, "      -- 取消キー(右:オレンジ):描画設定" ); Lib_chrdisp( 27, 8, "--- ■ | □ " ); Lib_chrdisp( 27, 10, "--- ● | ○ " ); Lib_chrdisp( 27, 12, "--- [■] | + " ); Lib_chrdisp( 27, 14, "--- -- | ⊂⊃" ); Lib_chrdisp( 27, 16, "--- Gr● | Gr■" ); Lib_chrdisp( 27, 18, "--- Free | Spln" ); Lib_chrdisp( 27, 20, "--- A | Eras" ); Lib_chrdisp( 5, 22, "[描画設定] ---- 取消キー(右:オレンジ)押下時" ); Lib_chrdisp( 8, 24, " [濃度設定] -- 手動描画の濃度設定" ); Lib_chrdisp( 8, 26, " [回 転 角] -- 手動描画の角度設定" ); Lib_chrdisp( 8, 28, " [角度調整] -- 角度調整のON/OFF" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 矩形ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp31( ) { Lib_chrdisp( 5, 5, "[ ■ ]" ); Lib_chrdisp( 8, 8, " 矩形(塗りつぶし)描画を行います。まず始点を設" ); Lib_chrdisp( 8, 10, "定し、次に終点を設定します。角度調整がONになって" ); Lib_chrdisp( 8, 12, "いる場合は、さらにマウスを動かし矩形を回転させ" ); Lib_chrdisp( 8, 14, "て角度を設定します。設定矩形が描画されます。" ); Lib_chrdisp( 5, 17, "[ □ ]" ); Lib_chrdisp( 8, 20, " 矩形(塗り無し)描画を行います。描画方法は上記" ); Lib_chrdisp( 8, 22, "の『■』と同じです。取消キー(右:オレンジ)を押下する" ); Lib_chrdisp( 8, 24, "ことで線幅の設定が行えます。線幅の設定値はパッド" ); Lib_chrdisp( 8, 26, "右に表\示されます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 丸ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp32( ) { Lib_chrdisp( 5, 5, "[ ● ]" ); Lib_chrdisp( 8, 8, " 円(塗りつぶし)描画を行います。まず中心を設定し" ); Lib_chrdisp( 8, 10, "次に半径を設定することで円が描画されます。" ); Lib_chrdisp( 5, 17, "[ ○ ]" ); Lib_chrdisp( 8, 20, " 円(塗り無し)描画を行います。描画の方法は上記の" ); Lib_chrdisp( 8, 22, "『●』と同じです。取消キー(右:オレンジ)を押下するこ" ); Lib_chrdisp( 8, 24, "とで線幅の設定が行えます。線幅の設定値はパッド右" ); Lib_chrdisp( 8, 26, "に表\示されます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 変形ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp33( ) { Lib_chrdisp( 5, 5, "[ [■] ] ---- 二重矩形描画" ); Lib_chrdisp( 8, 8, " [縮 小 方 向] -- 内側矩形縮小方向の設定" ); Lib_chrdisp( 8, 10, " [内・外側濃度] -- 各矩形の塗潰し濃度の設定" ); Lib_chrdisp( 8, 12, " [内側 : 外側] -- 二重矩形の比率(長さ)の設定" ); Lib_chrdisp( 8, 14, "          但し(外側=全体−内側)です。" ); Lib_chrdisp( 5, 17, "[ + ]" ); Lib_chrdisp( 8, 20, " トンボ(塗り潰し)描画を行います。取消(右:オレンジ)" ); Lib_chrdisp( 8, 22, "を押下することで線幅の設定が行えます。線幅の設定" ); Lib_chrdisp( 8, 24, "値はパッド右に表\示されます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** ライン1ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp34( ) { Lib_chrdisp( 5, 5, "[ -- ]" ); Lib_chrdisp( 8, 8, " 直線の描画を行います。まず始点を設定し次に終点" ); Lib_chrdisp( 8, 10, "を設定し,描画します。描画できる線幅は1のみです。" ); Lib_chrdisp( 5, 17, "[⊂⊃]" ); Lib_chrdisp( 8, 20, " 直線(連続円)の描画を行います。描画方法は上記の" ); Lib_chrdisp( 8, 22, "『--』と同じです。取消キー(右:オレンジ)を押下する" ); Lib_chrdisp( 8, 24, "ことで描画円半径の設定が行えます。設定値はパッド" ); Lib_chrdisp( 8, 26, "右に表\示されます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** グラデーションヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp35( ) { Lib_chrdisp( 5, 5, "[Gr●]-- 取消キー(右:オレンジ):濃度設定" ); Lib_chrdisp( 8, 8, " 円(グラデーション)描画を行います。まず中心を設定し、" ); Lib_chrdisp( 8, 10, "次に半径を設定することで描画されます。" ); Lib_chrdisp( 5, 13, "[Gr■]-- 取消キー(右:オレンジ):濃度設定" ); Lib_chrdisp( 8, 16, " 矩形(グラデーション)描画を行います。まず始点を指" ); Lib_chrdisp( 8, 18, "定し次に終点を設定を設定することで描画されます。" ); Lib_chrdisp( 8, 22, "○ 取消キー(右:オレンジ)押下時の設定濃度は[Gr●]と" ); Lib_chrdisp( 8, 24, "[Gr■]の共通設定となります。内側濃度から外側濃度" ); Lib_chrdisp( 8, 26, "へのグラデーションで描画されます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** ライン2ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp36( ) { Lib_chrdisp( 5, 5, "[Free]" ); Lib_chrdisp( 8, 8, " フリーハンド描画を行います。押下している間描画" ); Lib_chrdisp( 8, 10, "を行います。終了するときは画面右上の[戻る]を押下" ); Lib_chrdisp( 8, 12, "してください。取消キー(右:オレンジ)を押下することで" ); Lib_chrdisp( 8, 14, "半径の設定が行えます。設定値はパッド右に表\示。" ); Lib_chrdisp( 5, 17, "[Spln]" ); Lib_chrdisp( 8, 20, " スプライン描画を行います。実行キー(左: 赤 )でドット" ); Lib_chrdisp( 8, 22, "の設定を行い、取消キー(右:オレンジ)で描画されます。" ); Lib_chrdisp( 8, 24, "パッド上で取消キー(右:オレンジ)を押下すると半径と描" ); Lib_chrdisp( 8, 26, "画ステップを設定できます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 文字と、消しゴムヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp37( ) { Lib_chrdisp( 5, 5, "[ A ]" ); Lib_chrdisp( 8, 8, " 文字描画を行います。文字列を設定しますと文字描" ); Lib_chrdisp( 8, 10, "画位置設定用のBOXが表\示されますので、描画位置を設" ); Lib_chrdisp( 8, 12, "定してください。取消キー(右:オレンジ)押下により表\示" ); Lib_chrdisp( 8, 14, "指定、拡大率、文字間ステップの設定が行えます。" ); Lib_chrdisp( 5, 17, "[Eras]" ); Lib_chrdisp( 8, 20, " フリーハンドクリアを行います。押下している間画" ); Lib_chrdisp( 8, 22, "像のクリアをします。取消キー(右:オレンジ)を押下する" ); Lib_chrdisp( 8, 24, "ことで半径の設定が行えます。半径の設定値はパッド" ); Lib_chrdisp( 8, 26, "右に表\示されます。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 自動描画ヘルプ表示 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnHelp40( ) { Lib_chrdisp( 5, 5, "<自動描画>-- 実行キー(左: 赤 ):複数の同形状の描画" ); Lib_chrdisp( 5, 6, "      -- 取消キー(右:オレンジ):描画設定" ); Lib_chrdisp( 8, 8, " まず、XY方向の描画数と描画形状の設定を行いま" ); Lib_chrdisp( 8, 10, "す。描画可能\形状は■、□、[■]、+、○、●です。" ); Lib_chrdisp( 8, 12, "次に基準の形状を始点、終点、角度で設定します。" ); Lib_chrdisp( 8, 14, "最後に描画配置の終点を設定し(描画予\想図表\示)、" ); Lib_chrdisp( 8, 16, "自動描画させます。" ); Lib_chrdisp( 5, 19, "[描画設定] ---- 取消キー(右:オレンジ)押下時" ); Lib_chrdisp( 8, 21, " [濃度設定] -- 自動描画の濃度設定" ); Lib_chrdisp( 8, 23, " [回 転 角] -- 自動描画の角度設定" ); Lib_chrdisp( 8, 25, " [角度調整] -- 角度調整のON/OFF" ); Lib_chrdisp( 8, 28, "○描画数が多い場合、描画が時間がかかる場合有り。" ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 濃度と角度(調整ON/OFF含)の設定 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnLvAngSet( type, level, angle, on_off ) int type; /*0:クリア時、1:描画時*/ int *level; int *angle; int *on_off; { int no; int pad_level; PVAL value[3]; /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドのタイトル */ Lib_view_set_title( pad_level, SetLvAngMenu[0][iLanguage] ); /* メニューの登録 */ Lib_view_set_uniq_numeral( pad_level, 5, 5, SetLvAngMenu[1][iLanguage], *level, -1, 255, 0 ); Lib_view_set_uniq_numeral( pad_level, 5, 35, SetLvAngMenu[2][iLanguage], *angle, -180, 180, 1 ); Lib_view_set_uniq_alter ( pad_level, 5, 65, SetLvAngMenu[3][iLanguage], *on_off, 2 ); /* パッドの表示位置の取得 */ Lib_view_set_size( pad_level, 100, 130, 35, 5 ); /* メニューの表示 */ Lib_draw_menu( pad_level ); /* メニュー値の取得 */ if( ERROR_RETURN != ( no = Lib_process_menu( pad_level, value ) ) ) { switch( no ) { case 101: /*「実行」が選択された */ *level = value[0].value_type; *angle = value[1].value_type; *on_off = value[2].on_off_type; break; case 102: /*「取り消し」が選択された */ break; } }/* パッドの消去 */ Lib_erase_menu( pad_level ); /* パッドのクローズ */ Lib_view_close( pad_level ); if ( -1 == *level ) /*濃度参照?*/ *level = fnReferLv(); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 濃度参照 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ int fnReferLv() { int xs, ys, xe, ye; struct _deviinfo devi; xs = ( Lib_get_dx_size() / 2 ) - 10; ys = ( Lib_get_dy_size() / 2 ) - 10; xe = ( Lib_get_dx_size() / 2 ) + 10; ye = ( Lib_get_dy_size() / 2 ) + 10; Lib_chrdisp( 1, 30, ErrorComment[ 1][iLanguage] ); /* 処理範囲の設定 */ XXwind_set( &xs, &ys, &xe, &ye ); Lib_chrdisp( 1, 30, " " ); /* 処理範囲の設定 */ Lib_window( xs, ys, xe, ye ); /*平均、標準偏差、最大、最小の取得*/ Lib_stddevi( 0, &devi ); /* 処理範囲の設定 */ Lib_window( 0, 0, 511, 479 ); /* 平均濃度を戻す */ return ( XXd4i5_d( devi.average ) ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 素子数と描画形状の設定 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (自動描画) * *********** ********* ******* ***** *** */ static void fnAutoDraw( ) { int no; int pad_level; PVAL value[3]; int Flag = 0; /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドのタイトル */ Lib_view_set_title( pad_level, SetAutoMenu[0][iLanguage] ); /* メニューの登録 */ Lib_view_set_uniq_numeral( pad_level, 5, 5, SetAutoMenu[1][iLanguage], iAutoXmax, 2, 10, 0 ); Lib_view_set_uniq_numeral( pad_level, 5, 35, SetAutoMenu[2][iLanguage], iAutoYmax, 2, 10, 1 ); Lib_view_set_select( pad_level, 5, 65, SetAutoMenu[3][iLanguage], iAutoForm, 6, AutoTypeSelec[iLanguage], 2 ); /* パッドの表示位置の取得 */ Lib_view_set_size( pad_level, 100, 130, 35, 5 ); /* メニューの表示 */ Lib_draw_menu( pad_level ); /* メニュー値の取得 */ if( ERROR_RETURN != ( no = Lib_process_menu( pad_level, value ) ) ) { switch( no ) { case 101: /*「実行」が選択された */ iAutoXmax = value[0].value_type; iAutoYmax = value[1].value_type; iAutoForm = value[2].select_type; Flag = 1; break; case 102: /*「取り消し」が選択された */ break; } }/* パッドの消去 */ Lib_erase_menu( pad_level ); /* パッドのクローズ */ Lib_view_close( pad_level ); /* 上のパッドで「実行」が選択された */ if( 1 == Flag ) { /* 画像のバックアップ */ fnBackUp( ); /* 自動描画 */ fnAutoPosi( iAutoXmax, iAutoYmax, iAutoForm ); } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** サイズ、始点、終点の設定 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (自動描画) * *********** ********* ******* ***** *** */ static void fnAutoPosi( MaxX, MaxY, type ) int MaxX; int MaxY; int type; { int AdjAngle; int dx, dy, dw, i; int AutoRadius = 1; int xpos, ypos; int s_xpos, s_ypos; int sts; int BaseX, BaseY; /* 自動描画形状が円形以外の場合 */ if( type < NORMAL_CIRCLE ) { /* 自動描画始点BOXの設定 */ fnBoxEstab( &tABox[0][0], iAutoAng ); /* 自動描画始点BOXの角度調整 */ if( ON == iAutoAdj ) fnBoxAdjst( &tABox[0][0], iAutoAng, &AdjAngle ); /* 始点BOXの始点取得 */ BaseX = tABox[0][0].pnt[0].x; BaseY = tABox[0][0].pnt[0].y; /* 終点位置の初期化 */ s_xpos = xpos = 500; s_ypos = ypos = 450; /* カーソルの移動 */ Lib_move_cursor( xpos, ypos ); /* BOX群の初期表示 */ for( dy = 0; dy < MaxY; dy++ ) { for( dx = 0; dx < MaxX; dx++ ) { for( i = 0; i < BOX_PLOT_NO; i++ ) { /* 自動描画各位置の取得 */ tABox[dx][dy].pnt[i].x = tABox[0][0].pnt[i].x + dx * ( (xpos-BaseX) / (MaxX-1) ); tABox[dx][dy].pnt[i].y = tABox[0][0].pnt[i].y + dy * ( (ypos-BaseY) / (MaxY-1) ); } /* BOX描画 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_DRAW, LINE_PLOT ); } } /* 終点の取得 */ for (;;) { /* カーソル位置読みとり */ sts = 0; sts = Lib_see_current_position( &xpos, &ypos ); /* カーソル位置が移動した場合 */ if ( s_xpos != xpos || s_ypos != ypos ) { /* カーソル移動 */ Lib_move_cursor( xpos, ypos ); /* 前のBOX群の消去 */ for( dy = 0; dy < MaxY; dy++ ) { for( dx = 0; dx < MaxX; dx++ ) /* BOX消去 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_ERAS, LINE_PLOT ); } s_xpos = xpos; s_ypos = ypos; /* BOX群の描画 */ for( dy = 0; dy < MaxY; dy++ ) { for( dx = 0; dx < MaxX; dx++ ) { for( i = 0; i < BOX_PLOT_NO; i++ ) { /* 自動描画各位置の取得 */ tABox[dx][dy].pnt[i].x = tABox[0][0].pnt[i].x + dx * ( (xpos-BaseX) / (MaxX-1) ); tABox[dx][dy].pnt[i].y = tABox[0][0].pnt[i].y + dy * ( (ypos-BaseY) / (MaxY-1) ); } /* BOX消去 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_DRAW, LINE_PLOT ); } } /* 終点位置の表示 */ Lib_sprintf( baStr, "(%3d, %3d)", xpos, ypos ); Lib_chrdisp( 1, 30, baStr ); } /* 実行キー押下時ブレイク */ if ( CURSOR_EXECUTE == sts ) break; } /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE | BIN_PLANE ); /* ビデオ出力表示項目制御 */ Lib_display_control( GRAY_PLANE | CHAR_PLANE ); /* コメント表示 */ Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, 100, 256, WaitingComment[2][iLanguage] ); /* 描画形状に振り分け */ if ( FRAME_SQUARE == type ) fnFrameBoxAt( iSquareW, iAutoLv ); else if( DOUBLE_SQUARE == type ) fnDualBoxAt( iOuterDblLv, iInnerDblLv ); else if( NORMAL_CROSS == type ) fnCrossAt( iAutoLv, iTommboW ); else fnDaubBoxAt( iAutoLv ); } /* 描画形状が円形の場合 */ else { /* 自動描画始点ENの設定 */ XXcircle_set( &tAcir[0][0].x, &tAcir[0][0].y, &AutoRadius, ON ); /* 始点ENの始点取得 */ BaseX = tAcir[0][0].x; BaseY = tAcir[0][0].y; /* 終点の取得 */ for ( ; ; ) { /* カーソル位置読みとり */ sts = 0; sts = Lib_see_current_position( &xpos, &ypos ); /* カーソル位置が移動した場合 */ if ( s_xpos != xpos || s_ypos != ypos ) { /* カーソル移動 */ Lib_move_cursor( xpos, ypos ); /* 前のEN群の消去 */ for( dy = 0; dy < MaxY; dy++ ) { for( dx = 0; dx < MaxX; dx++ ) /* 各EN消去 */ Lib_erascircle( tAcir[dx][dy].x, tAcir[dx][dy].y, AutoRadius ); } s_xpos = xpos; s_ypos = ypos; /* EN群の描画 */ for( dy = 0; dy < MaxY; dy++ ) { for( dx = 0; dx < MaxX; dx++ ) { /* 自動描画各中心の取得 */ tAcir[dx][dy].x = BaseX + dx * ( (xpos-BaseX) / (MaxX-1) ); tAcir[dx][dy].y = BaseY + dy * ( (ypos-BaseY) / (MaxY-1) ); /* 各EN描画 */ Lib_drawcircle( tAcir[dx][dy].x, tAcir[dx][dy].y, AutoRadius ); } } /* 終点位置の表示 */ Lib_chrdisp( 1, 30, " " ); Lib_sprintf( baStr, "(%3d, %3d)", xpos, ypos ); Lib_chrdisp( 1, 30, baStr ); } /* 実行キー押下時ブレイク */ if ( CURSOR_EXECUTE == sts ) break; } /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE | BIN_PLANE ); /* ビデオ出力表示項目制御 */ Lib_display_control( GRAY_PLANE | CHAR_PLANE ); /* コメント表示 */ Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, 100, 256, WaitingComment[2][iLanguage] ); /* 描画形状が塗潰し円の場合 */ if ( NORMAL_CIRCLE == type ) { /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); for( dy = 0; dy < MaxY; dy++ ) { for( dx = 0; dx < MaxX; dx++ ) { /* 円の描画(線画プレーン) */ Lib_drawcircle( tAcir[dx][dy].x, tAcir[dx][dy].y, AutoRadius ); /* 円内部の塗潰し(二値プレーン) */ Lib_paint( tAcir[dx][dy].x, tAcir[dx][dy].y, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* 円の消去 */ Lib_erascircle( tAcir[dx][dy].x, tAcir[dx][dy].y, AutoRadius ); } } /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, iAutoLv ); /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); } else { /* 指定描画数分 */ for( dy = 0; dy < MaxY; dy++ ) { for( dx = 0; dx < MaxX; dx++ ) { /* 線幅 */ for ( dw=0; dwpnt[0].x = Box->pnt[4].x = xs; Box->pnt[0].y = Box->pnt[4].y = ys; Box->pnt[1].x = xe; Box->pnt[1].y = ys; Box->pnt[2].x = xe; Box->pnt[2].y = ye; Box->pnt[3].x = xs; Box->pnt[3].y = ye; } /* 角度が90の時の各頂点の設定 */ else if( 90 == angle ) { XXbox_set( &xs, &ys, &xe, &ye, ON ); Box->pnt[0].x = Box->pnt[4].x = xe; Box->pnt[0].y = Box->pnt[4].y = ys; Box->pnt[1].x = xe; Box->pnt[1].y = ye; Box->pnt[2].x = xs; Box->pnt[2].y = ye; Box->pnt[3].x = xs; Box->pnt[3].y = ys; } /* 角度が180の時の各頂点の設定 */ else if( 180 == angle || -180 == angle ) { XXbox_set( &xs, &ys, &xe, &ye, ON ); Box->pnt[0].x = Box->pnt[4].x = xe; Box->pnt[0].y = Box->pnt[4].y = ye; Box->pnt[1].x = xs; Box->pnt[1].y = ye; Box->pnt[2].x = xs; Box->pnt[2].y = ys; Box->pnt[3].x = xe; Box->pnt[3].y = ys; } /* 角度が270の時の各頂点の設定 */ else if( -90 == angle ) { XXbox_set( &xs, &ys, &xe, &ye, ON ); Box->pnt[0].x = Box->pnt[4].x = xs; Box->pnt[0].y = Box->pnt[4].y = ye; Box->pnt[1].x = xs; Box->pnt[1].y = ys; Box->pnt[2].x = xe; Box->pnt[2].y = ys; Box->pnt[3].x = xe; Box->pnt[3].y = ye; } else { /* 始点設定 */ Point.x = s_xpos = xpos = 255; Point.y = s_ypos = ypos = 240; Point.wScale = 1; /* カーソル移動 */ Lib_move_cursor( xpos, ypos ); /* 角度F(描画回転角)をradian単位に変更 */ angleF = ( (double)angle * 3.14159 ) / 180; /* 角度S(描画回転角+90)をradian単位に変更 */ angleS = ( (double)( angle - 90 ) * 3.14159 ) / 180; /* 角度Fが0°〜45°、135°〜225°、315°〜360°範囲内の場合  */ /*            Ax+By+C=0型直線方程式のA、B、C係数の値 */ if( -1 < tan(angleF) && tan(angleF) < 1) { coefAe = XXd4i5_d( tan(angleF) * 65536 ); coefBe = -65536; } /* 角度Fが上記範囲外の場合                  */ /*            Ax+By+C=0型直線方程式のA、B、C係数の値 */ else { coefAe = 65536; coefBe = -XXd4i5_d( 65536 / tan(angleF) ); } /* 角度Sが0°〜45°、135°〜225°、315°〜360°範囲内の場合  */ /*               Ax+By+C=0型直線方程式のA、Bの値 */ if( -1 < tan(angleS) && tan(angleS) < 1 ) { coefAo = XXd4i5_d( tan(angleS) * 65536 ); coefBo = -65536; } /* 角度Sが上記範囲外の場合                  */ /*               Ax+By+C=0型直線方程式のA、Bの値 */ else { coefAo = 65536; coefBo = -XXd4i5_d( 65536 / tan(angleS) ); } /* 図1のLine◎〜Bの直線方程式に係数A,Bを代入する */ BoxSide[0].a = BoxSide[2].a = coefAe; BoxSide[1].a = BoxSide[3].a = coefAo; BoxSide[0].b = BoxSide[2].b = coefBe; BoxSide[1].b = BoxSide[3].b = coefBo; /* 図1のLine◎〜LineBの直線方程式の係数Cの初期化 */ for( i=0; i<4; i++ ) BoxSide[i].c = 0; /* BOX始点(◎C)の取得 */ for (;;) { /* カーソル位置読みとり */ sts = 0; sts = Lib_see_current_position( &xpos, &ypos ); /* カーソル位置が移動した場合 */ if ( s_xpos != xpos || s_ypos != ypos ) { /* 始点表示のクリア */ Lib_chrdisp( 1, 30, " " ); /* カーソルの移動 */ Lib_move_cursor( xpos, ypos ); /* BOX始点よりLine◎@の切片Cを算出 */ BoxSide[0].c = -( ((coefAe*xpos) + (coefBe*ypos)) * 16 ) / 65536; BoxSide[1].c = -( ((coefAo*xpos) + (coefBo*ypos)) * 16 ) / 65536; /* 始点位置の表示 */ Lib_sprintf( baStr, "(%3d, %3d)", xpos, ypos ); Lib_chrdisp( 1, 30, baStr ); s_xpos = xpos; s_ypos = ypos; } /* 実行キー押下時に現在のBOX始点位置とLine◎@の切片Cを取得 */ if ( CURSOR_EXECUTE == sts ) { /* Line◎@の切片Cを取得 */ BoxSide[0].c = -( ((coefAe*xpos) + (coefBe*ypos)) * 16 ) / 65536; BoxSide[1].c = -( ((coefAo*xpos) + (coefBo*ypos)) * 16 ) / 65536; /* Point◎Cの位置を取得 */ Box->pnt[0].x = Box->pnt[4].x = xpos; Box->pnt[0].y = Box->pnt[4].y = ypos; break; } } s_xpos = xpos = Box->pnt[0].x; s_ypos = ypos = Box->pnt[0].y; /* カーソルの移動 */ Lib_move_cursor( xpos, ypos ); /* BOX終点(A)の取得 */ for (;;) { /* カーソル位置読みとり */ sts = 0; sts = Lib_see_current_position( &xpos, &ypos ); /* カーソル位置が移動した場合 */ if ( s_xpos != xpos || s_ypos != ypos ) { /* 前の矩形を消去 */ Lib_plot( BOX_PLOT_NO, Box->pnt, GRAPH_ERAS, LINE_PLOT ); /* 終点表示のクリア */ Lib_chrdisp( 1, 30, " " ); /* カーソルの移動 */ Lib_move_cursor( xpos, ypos ); /* BOX終点よりLineABの切片Cを算出 */ BoxSide[2].c = -( ((coefAe*xpos) + (coefBe*ypos)) * 16 ) / 65536; BoxSide[3].c = -( ((coefAo*xpos) + (coefBo*ypos)) * 16 ) / 65536; /* PointAの位置を取得 */ Box->pnt[2].x = xpos; Box->pnt[2].y = ypos; /* Point@の位置を取得(Line◎Bの交点) */ Lib_clp_cross_2LineC( BoxSide[0], BoxSide[3], &Point, &angleF ); Box->pnt[1].x = Point.x; Box->pnt[1].y = Point.y; /* PointBの位置を取得(Line@Aの交点) */ Lib_clp_cross_2LineC( BoxSide[1], BoxSide[2], &Point, &angleF ); Box->pnt[3].x = Point.x; Box->pnt[3].y = Point.y; /* BOX描画 */ Lib_plot( BOX_PLOT_NO, Box->pnt, GRAPH_DRAW, LINE_PLOT ); s_xpos = xpos; s_ypos = ypos; /* 終点位置の表示 */ Lib_sprintf( baStr, "(%3d, %3d)", xpos, ypos ); Lib_chrdisp( 1, 30, baStr ); } /* 実行キが押下されたら終了 */ if ( CURSOR_EXECUTE == sts ) { /* 終点表示のクリア */ Lib_chrdisp( 1, 30, " " ); break; } } } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** BOX調整 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnBoxAdjst( Box, angle, AdjAngle ) ID_BOX *Box; /* BOX位置 */ int angle; int *AdjAngle; { int i; int sts; int Cx, Cy; int xpos, ypos; int s_xpos, s_ypos; double dAngle; double dBaseAngle; CPNT_T CntrPnt, MovePnt; /* BOX中心と角度指定点 */ ID_BOX Base; /* BOX位置(元) */ CLINE_T MoveLn; /* 型をdouble型に変換 */ dAngle = ( double )angle; /* カーソル始点をBOXの右下位置に指定 */ s_xpos = xpos = Box->pnt[2].x; s_ypos = ypos = Box->pnt[2].y; /* カーソルを始点に移動 */ Lib_move_cursor( xpos, ypos ); /* BOX中心の取得(CPNT_T型) */ Cx = CntrPnt.x = ( Box->pnt[0].x + Box->pnt[2].x ) / 2; Cy = CntrPnt.y = ( Box->pnt[0].y + Box->pnt[2].y ) / 2; CntrPnt.wScale = 1; /* 現在のBOX各頂点、中心位置と角度より、描画角0度時のBOX各頂点を算出 */ for( i = 0; i < BOX_PLOT_NO; i++ ) fnPosiCalc( Box->pnt[i], &Base.pnt[i], Cx, Cy, -angle ); /* 角度指定点の初期化 */ MovePnt.x = Base.pnt[2].x; MovePnt.y = Base.pnt[2].y; MovePnt.wScale = 1; /* BOX中心と角度指定点より傾きを算出 */ Lib_clp_line_2Point( CntrPnt, MovePnt, &MoveLn, &dBaseAngle ); /* 角度算出 */ if( 0 <= CntrPnt.x - MovePnt.x ) { if( 0 < dBaseAngle ) dBaseAngle -= 180; else dBaseAngle += 180; } /* BOXを初期位置に描画 */ Lib_plot( BOX_PLOT_NO, Box->pnt, GRAPH_DRAW, LINE_PLOT ); /* ループ */ for (;;) { /* カーソル位置読みとり */ sts = 0; sts = Lib_see_current_position( &xpos, &ypos ); /* カーソル位置が移動した場合 */ if ( s_xpos != xpos || s_ypos != ypos ) { /* 前のBOXを消去 */ Lib_plot( BOX_PLOT_NO, Box->pnt, GRAPH_ERAS, LINE_PLOT ); /* 角度表示の消去 */ Lib_chrdisp( 1, 30, "               " ); /* カーソル位置を取得 */ s_xpos = MovePnt.x = xpos; s_ypos = MovePnt.y = ypos; /* BOX中心と角度指定点より傾きを算出 */ Lib_clp_line_2Point( CntrPnt, MovePnt, &MoveLn, &dAngle ); /* 角度算出 */ if( 0 < CntrPnt.x - MovePnt.x ) { if( 0 < dAngle ) dAngle -= 180; else dAngle += 180; } else if( 0 == CntrPnt.x - MovePnt.x ) { if( 0 < MovePnt.y - CntrPnt.y ) { if( 0 < dAngle ) dAngle -= 180; else dAngle += 180; } } dAngle -= dBaseAngle; if( 180 < dAngle ) dAngle -= 360; else if( dAngle < -180 ) dAngle += 360; /* 角度をint型に変更 */ *AdjAngle = XXd4i5_d( dAngle ); /* 角度調整後の各頂点の算出 */ for( i = 0; i < BOX_PLOT_NO; i++ ) fnPosiCalc( Base.pnt[i], &Box->pnt[i], Cx, Cy, *AdjAngle ); /* カーソルの移動 */ Lib_move_cursor( Box->pnt[2].x, Box->pnt[2].y ); /* BOX描画 */ Lib_plot( BOX_PLOT_NO, Box->pnt, GRAPH_DRAW, LINE_PLOT ); /* 角度表示 */ Lib_sprintf( baStr, "(%3d)", *AdjAngle ); Lib_chrdisp( 1, 30, baStr ); } /* 実行キー押下時に現在のBOXを描画して終了 */ if ( CURSOR_EXECUTE == sts ) { Lib_plot( BOX_PLOT_NO, Box->pnt, GRAPH_DRAW, LINE_PLOT ); break; } } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 縮小位置 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnBoxReduce( Ante, Post, RatioX, RatioY ) ID_BOX Ante; /* BOX位置(縮小前) */ ID_BOX *Post; /* BOX位置(縮小後) */ double RatioX, RatioY; { int i; double Dist; CLINE_T B_Side[5]; CPNT_T Mddlp; CPNT_T AnteApex[5], PostApex[4], Pos[8]; /* 構造体の変更(ID_BOX→CPNT_T) */ for( i = 0; i < 5; i++ ) { AnteApex[i].x = Ante.pnt[i].x; AnteApex[i].y = Ante.pnt[i].y; AnteApex[i].wScale = 1; B_Side[i].a = 0; B_Side[i].b = 0; B_Side[i].c = 0; } /* 初期化 */ for( i = 0; i < 4; i++ ) { PostApex[i].x = 0; PostApex[i].y = 0; PostApex[i].wScale = 1; } /* 初期化 */ for( i = 0; i < 8; i++ ) { Pos[i].x = 0; Pos[i].y = 0; Pos[i].wScale = 1; } /* 各ライン上の縮小時位置の取得 */ for( i = 0; i < 4; i++ ) { /* 中心点取得 */ Lib_clp_center_2Point( AnteApex[i], AnteApex[i+1], &Mddlp, &Dist ); if ( 0 == i || 2 == i ) { Pos[ i*2 ].x = Mddlp.x + ( AnteApex[i].x - Mddlp.x) * RatioX; Pos[ i*2 ].y = Mddlp.y + ( AnteApex[i].y - Mddlp.y) * RatioX; Pos[i*2 + 1].x = Mddlp.x + ( AnteApex[i+1].x - Mddlp.x) * RatioX; Pos[i*2 + 1].y = Mddlp.y + ( AnteApex[i+1].y - Mddlp.y) * RatioX; } else { Pos[ i*2 ].x = Mddlp.x + ( AnteApex[i].x - Mddlp.x) * RatioY; Pos[ i*2 ].y = Mddlp.y + ( AnteApex[i].y - Mddlp.y) * RatioY; Pos[i*2 + 1].x = Mddlp.x + ( AnteApex[i+1].x - Mddlp.x) * RatioY; Pos[i*2 + 1].y = Mddlp.y + ( AnteApex[i+1].y - Mddlp.y) * RatioY; } } /* ライン上縮小時位置から各対応ラインを算出する */ Lib_clp_line_2Point( Pos[0], Pos[5], &B_Side[0], &Dist ); Lib_clp_line_2Point( Pos[2], Pos[7], &B_Side[1], &Dist ); Lib_clp_line_2Point( Pos[1], Pos[4], &B_Side[2], &Dist ); Lib_clp_line_2Point( Pos[3], Pos[6], &B_Side[3], &Dist ); Lib_clp_line_2Point( Pos[0], Pos[5], &B_Side[4], &Dist ); /* ラインの交点を取得(=縮小位置) */ for( i = 0; i < 4; i++ ) { Lib_clp_cross_2LineC( B_Side[i], B_Side[i+1], &PostApex[i], &Dist ); Post->pnt[i].x = PostApex[i].x; Post->pnt[i].y = PostApex[i].y; } Post->pnt[4].x = Post->pnt[0].x; Post->pnt[4].y = Post->pnt[0].y; } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** BOX 描画(塗潰し) ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnDaubBox( Box, level ) ID_BOX Box; /* BOX位置 */ int level; { /* メモリクリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); /* 線画プレーンにBOXを描画 */ Lib_plot( BOX_PLOT_NO, Box.pnt, GRAPH_DRAW, LINE_PLOT ); /* ボックス内塗潰描画(対象:二値プレーン) */ Lib_paint( (Box.pnt[0].x + Box.pnt[2].x)/2, (Box.pnt[0].y + Box.pnt[2].y)/2, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** BOX 描画(塗潰し) ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (自動描画) * *********** ********* ******* ***** *** */ static void fnDaubBoxAt( level ) int level; { int DPosX, DPosY; int dx, dy; /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); /* 指定描画数分のループ */ for( dy = 0; dy < iAutoYmax; dy++ ) { for( dx = 0; dx < iAutoXmax; dx++ ) { /* 中心位置設定 */ DPosX = (tABox[dx][dy].pnt[0].x + tABox[dx][dy].pnt[2].x)/2; DPosY = (tABox[dx][dy].pnt[0].y + tABox[dx][dy].pnt[2].y)/2; /* BOX描画 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_DRAW, LINE_PLOT ); /* ボックス内塗潰描画(対象:二値プレーン) */ Lib_paint( DPosX, DPosY, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* BOX消去 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_ERAS, LINE_PLOT ); } } /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 矩形の線幅選択 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnFrameBoxSet( ) { /* 矩形の線幅設定 */ iSquareW = (int)Lib_get_value_by_ten_keyboad( 20, 100, iSquareW, 1, 50 ); /* 矩形の線幅表示 */ Lib_sprintf( baStr, "%d ", iSquareW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 5, MN_MENU_1_YE - 3, baStr ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** グレイメモリへのBOX描画 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnLineBox( mem_no, level, Box ) int mem_no; /* メモリNO */ int level; /* 描画濃度レベル */ ID_BOX Box; /* BOX位置 */ { /* BOXラインの描画 */ Lib_xgline( mem_no, level, Box.pnt[0].x, Box.pnt[0].y, Box.pnt[1].x, Box.pnt[1].y ); Lib_xgline( mem_no, level, Box.pnt[1].x, Box.pnt[1].y, Box.pnt[2].x, Box.pnt[2].y ); Lib_xgline( mem_no, level, Box.pnt[2].x, Box.pnt[2].y, Box.pnt[3].x, Box.pnt[3].y ); Lib_xgline( mem_no, level, Box.pnt[3].x, Box.pnt[3].y, Box.pnt[4].x, Box.pnt[4].y ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** BOX 描画(枠のみ) ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnFrameBox( Box, width, level ) ID_BOX Box; /* BOX位置 */ int width; /*入力:座標表示ON:表示 OFF:非表示*/ int level; /*描画濃度レベル*/ { int i; double Dist, dWidth; double InnerRX, InnerRY; CPNT_T Mddlp; CPNT_T Apex[BOX_PLOT_NO]; ID_BOX InBox; /* BOX位置(内) */ /* 線幅が1の場合 */ if( 1 == width ) fnLineBox( iDrawMem, level, Box ); /* 線幅が1以外の場合 */ else { /* 型をdouble型に変換 */ dWidth = (double)width + 1; /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); /* 構造体の変更(ID_BOX→CPNT_T) */ for( i = 0; i < 5; i++ ) { Apex[i].x = Box.pnt[i].x; Apex[i].y = Box.pnt[i].y; Apex[i].wScale = 1; } /* 横方向長さの取得 */ Lib_clp_center_2Point( Apex[0], Apex[1], &Mddlp, &Dist ); Dist = XXu_dabs( Dist ); /* 線幅の横方向長さに対する比率の取得 */ InnerRX = (Dist - (2 * dWidth)) / Dist; /* 縦方向長さの取得 */ Lib_clp_center_2Point( Apex[1], Apex[2], &Mddlp, &Dist ); Dist = XXu_dabs( Dist ); /* 線幅の縦方向長さに対する比率の取得 */ InnerRY = (Dist - (2 * dWidth)) / Dist; if( InnerRX <= 0 ) InnerRX = 0; if( InnerRY <= 0 ) InnerRY = 0; /* 内側位置の取得 */ fnBoxReduce( Box, &InBox, InnerRX, InnerRY ); /* クリア */ Lib_memory_clear( LINE_PLANE ); /* 内側BOXの描画 */ Lib_plot( BOX_PLOT_NO, InBox.pnt, GRAPH_DRAW, LINE_PLOT ); /* 外側BOXの描画 */ Lib_plot( BOX_PLOT_NO, Box.pnt, GRAPH_DRAW, LINE_PLOT ); Mddlp.x = InBox.pnt[0].x + ((Box.pnt[0].x - InBox.pnt[0].x) / 2); Mddlp.y = InBox.pnt[0].y + ((Box.pnt[0].y - InBox.pnt[0].y) / 2); /* BOX二重間を塗潰(対象:二値プレーン) */ Lib_paint( Mddlp.x, Mddlp.y, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level ); } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** BOX 描画(枠のみ) ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (自動描画) * *********** ********* ******* ***** *** */ static void fnFrameBoxAt( width, level ) int width; /*入力:座標表示ON:表示 OFF:非表示*/ int level; /*描画濃度レベル*/ { int i; int dx, dy; double Dist, dWidth; double InnerRX, InnerRY; CPNT_T Mddlp; CPNT_T Apex[BOX_PLOT_NO]; ID_BOX InBox; /* BOX位置(内外) */ /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); /* 線幅が1の場合 */ if( 1 == width ) { /* 指定描画数分のループ */ for( dy = 0; dy < iAutoYmax; dy++ ) { for( dx = 0; dx < iAutoXmax; dx++ ) /* BOX描画 */ fnLineBox( iDrawMem, level, tABox[dx][dy] ); } }/* 線幅が1でない場合 */ else { /* 型をdouble型に変換 */ dWidth = (double)width + 1; /* 指定描画数分のループ */ for( dy = 0; dy < iAutoYmax; dy++ ) { for( dx = 0; dx < iAutoXmax; dx++ ) { /* 構造体の変更(ID_BOX→CPNT_T) */ for( i = 0; i < 5; i++ ) { Apex[i].x = tABox[dx][dy].pnt[i].x; Apex[i].y = tABox[dx][dy].pnt[i].y; Apex[i].wScale = 1; } /* 横方向長さの取得 */ Lib_clp_center_2Point( Apex[0], Apex[1], &Mddlp, &Dist ); Dist = XXu_dabs( Dist ); /* 線幅の横方向長さに対する比率の取得 */ InnerRX = (Dist - (2 * dWidth)) / Dist; /* 縦方向長さの取得 */ Lib_clp_center_2Point( Apex[1], Apex[2], &Mddlp, &Dist ); Dist = XXu_dabs( Dist ); /* 線幅の縦方向長さに対する比率の取得 */ InnerRY = (Dist - (2 * dWidth)) / Dist; if( InnerRX <= 0 ) InnerRX = 0; if( InnerRY <= 0 ) InnerRY = 0; /* 内側位置の取得 */ fnBoxReduce( tABox[dx][dy], &InBox, InnerRX, InnerRY ); /* 内側BOXの描画 */ Lib_plot( BOX_PLOT_NO, InBox.pnt, GRAPH_DRAW, LINE_PLOT ); /* 外側BOXの描画 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_DRAW, LINE_PLOT ); Mddlp.x = InBox.pnt[0].x + ((tABox[dx][dy].pnt[0].x - InBox.pnt[0].x) / 2); Mddlp.y = InBox.pnt[0].y + ((tABox[dx][dy].pnt[0].y - InBox.pnt[0].y) / 2); /* BOX二重間を塗潰(対象:二値プレーン) */ Lib_paint( Mddlp.x, Mddlp.y, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* 内側BOXの消去 */ Lib_plot( BOX_PLOT_NO, InBox.pnt, GRAPH_ERAS, LINE_PLOT ); /* 外側BOXの消去 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_ERAS, LINE_PLOT ); } } /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level ); } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 二重矩形の設定 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnDualSet( ) { int no; int pad_level; PVAL value[6]; /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドのタイトル */ Lib_view_set_title( pad_level, SetDoubleSMenu[0][iLanguage] ); /* メニューの登録 */ Lib_view_set_select ( pad_level, 5, 5, SetDoubleSMenu[1][iLanguage], iRdcDir, 3, ReduceDirSelec[iLanguage], 0 ); Lib_view_set_uniq_numeral( pad_level, 5, 35, SetDoubleSMenu[2][iLanguage], iInnerDblLv, 0, 255, 1 ); Lib_view_set_uniq_numeral( pad_level, 5, 65, SetDoubleSMenu[3][iLanguage], iOuterDblLv, 0, 255, 2 ); Lib_view_set_uniq_numeral( pad_level, 5, 95, SetDoubleSMenu[4][iLanguage], iInRatio, 1, 10, 3 ); Lib_view_set_comment ( pad_level, 5, 125, SetDoubleSMenu[5][iLanguage], 4 ); Lib_view_set_uniq_numeral( pad_level, 5, 155, SetDoubleSMenu[6][iLanguage], iAlRatio-iInRatio, 1, 10, 5 ); /* パッドの表示位置の取得 */ Lib_view_set_size( pad_level, 100, 130, 35, 5 ); /* メニューの表示 */ Lib_draw_menu( pad_level ); /* メニュー値の取得 */ if( ERROR_RETURN != ( no = Lib_process_menu( pad_level, value ) ) ) { switch( no ) { case 101: /*「実行」が選択された */ iRdcDir = value[0].select_type; iInnerDblLv = value[1].value_type; iOuterDblLv = value[2].value_type; iInRatio = value[3].value_type; iAlRatio = value[5].value_type + iInRatio; break; case 102: /*「取り消し」が選択された */ break; } }/* パッドの消去 */ Lib_erase_menu( pad_level ); /* パッドのクローズ */ Lib_view_close( pad_level ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 二重矩形描画 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 図1(比率) | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ---------・--------- *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |←全体→| | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | ----・---- | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |← |← | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |外 |内 ・ | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | 側| 側| | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | →| →・ | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | ----|---- | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | ・ | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ---------|--------- *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ・ *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ static void fnDualBox( Box, level0, level1 ) ID_BOX Box; /* BOX位置 */ int level0; int level1; { ID_BOX InnerBox; /* BOX位置(内側) */ double RatioX = 1; double RatioY = 1; double dInnerRt, dTotalRt; /* 外側矩形の描画 */ fnDaubBox( Box, level0 ); /* 比率の取得 */ dInnerRt = ( double )iInRatio; dTotalRt = ( double )iAlRatio; if( VERTICAL_DIR != iRdcDir ) RatioX = dInnerRt / dTotalRt; if( HORIZONTAL_DIR != iRdcDir ) RatioY = dInnerRt / dTotalRt; /* 縮小位置の取得 */ fnBoxReduce( Box, &InnerBox, RatioX, RatioY ); /* 内側矩形の描画 */ fnDaubBox( InnerBox, level1 ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 二重矩形描画 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (自動描画) * *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 図1(比率) | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ---------・--------- *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |←全体→| | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | ----・---- | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |← |← | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |外 |内 ・ | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | 側| 側| | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | →| →・ | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | ----|---- | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | ・ | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ---------|--------- *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ・ *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ static void fnDualBoxAt( level0, level1 ) int level0; int level1; { ID_BOX InnerBox; int DPosX, DPosY; double RatioX = 1; double RatioY = 1; double dInnerRt, dTotalRt; int dx, dy; /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); /* 外側矩形の描画 */ /* 指定描画数分のループ */ for( dy = 0; dy < iAutoYmax; dy++ ) { for( dx = 0; dx < iAutoXmax; dx++ ) { /* 中心点の取得 */ DPosX = (tABox[dx][dy].pnt[0].x + tABox[dx][dy].pnt[2].x)/2; DPosY = (tABox[dx][dy].pnt[0].y + tABox[dx][dy].pnt[2].y)/2; /* BOX描画 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_DRAW, LINE_PLOT ); /* BOX内を塗潰(対象:二値プレーン) */ Lib_paint( DPosX, DPosY, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* BOX消去 */ Lib_plot( BOX_PLOT_NO, tABox[dx][dy].pnt, GRAPH_ERAS, LINE_PLOT ); } } /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level0 ); /* 比率の取得 */ dInnerRt = ( double )iInRatio; dTotalRt = ( double )iAlRatio; if( VERTICAL_DIR != iRdcDir ) RatioX = dInnerRt / dTotalRt; if( HORIZONTAL_DIR != iRdcDir ) RatioY = dInnerRt / dTotalRt; /* クリア */ Lib_memory_clear( BIN_PLANE ); /* 内側矩形の描画 */ /* 指定描画数分のループ */ for( dy = 0; dy < iAutoYmax; dy++ ) { for( dx = 0; dx < iAutoXmax; dx++ ) { /* 縮小位置の取得 */ fnBoxReduce( tABox[dx][dy], &InnerBox, RatioX, RatioY ); /* 縮小位置の中心取得 */ DPosX = (InnerBox.pnt[0].x + InnerBox.pnt[2].x)/2; DPosY = (InnerBox.pnt[0].y + InnerBox.pnt[2].y)/2; /* BOX描画 */ Lib_plot( BOX_PLOT_NO, InnerBox.pnt, GRAPH_DRAW, LINE_PLOT ); /* BOX内を塗潰(対象:二値プレーン) */ Lib_paint( DPosX, DPosY, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* BOX消去 */ Lib_plot( BOX_PLOT_NO, InnerBox.pnt, GRAPH_ERAS, LINE_PLOT ); } } /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level1 ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** トンボの線幅選択 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnCrossWSet( ) { /* トンボの線幅設定 */ iTommboW = (int)Lib_get_value_by_ten_keyboad( 20, 100, iTommboW, 1, 50 ); /* トンボの線幅表示 */ Lib_sprintf( baStr, "%d ", iTommboW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 5, MN_MENU_3_YE - 3, baStr ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** トンボ描画 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 図1 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 0=4---◎------@---1 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** F A *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** E B *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 3---D------C---2 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 図2 図3 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 0=12----1 0 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 10----11 2----3 | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | 3---------------2 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 9----8 5----4 | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 7----6 | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 1 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ static void fnCross( Box, level, width ) ID_BOX Box; int level; int width; { int i; double Dist; double dWidth; double RatioX = 1; double RatioY = 1; CPNT_T Mddlp[4]; CPNT_T AnteApex[5], PostApex[4], Posi[8]; CLINE_T B_Side[5]; struct COORDINATES_PAIR Rslt[13]; /* 構造体の変更(ID_BOX→CPNT_T) */ for( i = 0; i < 5; i++ ) { AnteApex[i].x = Box.pnt[i].x; AnteApex[i].y = Box.pnt[i].y; AnteApex[i].wScale = 1; } /* 線幅が1の場合 */ if( 1 == width ) { /* 矩形各辺の中心点の取得 */ Lib_clp_center_2Point( AnteApex[0], AnteApex[1], &Mddlp[0], &Dist ); Lib_clp_center_2Point( AnteApex[2], AnteApex[3], &Mddlp[1], &Dist ); Lib_clp_center_2Point( AnteApex[1], AnteApex[2], &Mddlp[2], &Dist ); Lib_clp_center_2Point( AnteApex[3], AnteApex[4], &Mddlp[3], &Dist ); /* トンボ描画 */ Lib_xgline( iDrawMem, level, Mddlp[0].x, Mddlp[0].y, Mddlp[1].x, Mddlp[1].y ); Lib_xgline( iDrawMem, level, Mddlp[2].x, Mddlp[2].y, Mddlp[3].x, Mddlp[3].y ); } /* 線幅が1でない場合 */ else { dWidth = (double)width + 1; /* 初期化 */ for( i = 0; i < 5; i++ ) { B_Side[i].a = 0; B_Side[i].b = 0; B_Side[i].c = 0; } for( i = 0; i < 4; i++ ) { PostApex[i].x = 0; PostApex[i].y = 0; PostApex[i].wScale = 1; } for( i = 0; i < 8; i++ ) { Posi[i].x = 0; Posi[i].y = 0; Posi[i].wScale = 1; } for( i = 0; i < 13; i++ ) { Rslt[i].x = 0; Rslt[i].y = 0; } /* 横方向長さの取得 */ Lib_clp_center_2Point( AnteApex[0], AnteApex[1], &Mddlp[0], &Dist ); Dist = XXu_dabs( Dist ); /* 線幅の横方向長さに対する比率の取得 */ RatioX = dWidth / Dist; /* 縦方向長さの取得 */ Lib_clp_center_2Point( AnteApex[1], AnteApex[2], &Mddlp[0], &Dist ); Dist = XXu_dabs( Dist ); /* 線幅の縦方向長さに対する比率の取得 */ RatioY = dWidth / Dist; if( RatioX <= 0 ) RatioX = 0; if( RatioY <= 0 ) RatioY = 0; /* 図1の0〜4より図1の◎〜F(=図2の0,1,3,4,6,7,9,10,12)の算出 */ for( i = 0; i < 4; i++ ) { /* 図1各辺の中心点取得 */ Lib_clp_center_2Point( AnteApex[i], AnteApex[i+1], &Mddlp[0], &Dist ); /* 各点の算出 */ if ( 0 == i || 2 == i ) { Posi[ i*2 ].x = Mddlp[0].x + ( AnteApex[i].x - Mddlp[0].x) * RatioX; Posi[ i*2 ].y = Mddlp[0].y + ( AnteApex[i].y - Mddlp[0].y) * RatioX; Posi[i*2 + 1].x = Mddlp[0].x + ( AnteApex[i+1].x - Mddlp[0].x) * RatioX; Posi[i*2 + 1].y = Mddlp[0].y + ( AnteApex[i+1].y - Mddlp[0].y) * RatioX; Rslt[ i*3 ].x = Mddlp[0].x + ( AnteApex[i].x - Mddlp[0].x) * RatioX; Rslt[ i*3 ].y = Mddlp[0].y + ( AnteApex[i].y - Mddlp[0].y) * RatioX; Rslt[i*3 + 1].x = Mddlp[0].x + ( AnteApex[i+1].x - Mddlp[0].x) * RatioX; Rslt[i*3 + 1].y = Mddlp[0].y + ( AnteApex[i+1].y - Mddlp[0].y) * RatioX; } else { Posi[ i*2 ].x = Mddlp[0].x + ( AnteApex[i].x - Mddlp[0].x) * RatioY; Posi[ i*2 ].y = Mddlp[0].y + ( AnteApex[i].y - Mddlp[0].y) * RatioY; Posi[i*2 + 1].x = Mddlp[0].x + ( AnteApex[i+1].x - Mddlp[0].x) * RatioY; Posi[i*2 + 1].y = Mddlp[0].y + ( AnteApex[i+1].y - Mddlp[0].y) * RatioY; Rslt[ i*3 ].x = Mddlp[0].x + ( AnteApex[i].x - Mddlp[0].x) * RatioY; Rslt[ i*3 ].y = Mddlp[0].y + ( AnteApex[i].y - Mddlp[0].y) * RatioY; Rslt[i*3 + 1].x = Mddlp[0].x + ( AnteApex[i+1].x - Mddlp[0].x) * RatioY; Rslt[i*3 + 1].y = Mddlp[0].y + ( AnteApex[i+1].y - Mddlp[0].y) * RatioY; } } /* 図2の内側4点(2,5,8,11)算出の為のライン算出 */ /* ([]内番号がが図1の○内番号に対応) */ Lib_clp_line_2Point( Posi[0], Posi[5], &B_Side[0], &Dist ); Lib_clp_line_2Point( Posi[2], Posi[7], &B_Side[1], &Dist ); Lib_clp_line_2Point( Posi[1], Posi[4], &B_Side[2], &Dist ); Lib_clp_line_2Point( Posi[3], Posi[6], &B_Side[3], &Dist ); Lib_clp_line_2Point( Posi[0], Posi[5], &B_Side[4], &Dist ); /* 上記ラインの交点の算出 */ for( i = 0; i < 4; i++ ) Lib_clp_cross_2LineC( B_Side[i], B_Side[i+1], &PostApex[i], &Dist ); /* 図2の内側4点の位置取得 */ Rslt[11].x = PostApex[0].x; Rslt[11].y = PostApex[0].y; Rslt[ 2].x = PostApex[1].x; Rslt[ 2].y = PostApex[1].y; Rslt[ 5].x = PostApex[2].x; Rslt[ 5].y = PostApex[2].y; Rslt[ 8].x = PostApex[3].x; Rslt[ 8].y = PostApex[3].y; /* 図2の12の位置取得 */ Rslt[12].x = Rslt[0].x; Rslt[12].y = Rslt[0].y; /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); /* 図2のようにトンボを描画 */ Lib_plot( 13, Rslt, GRAPH_DRAW, LINE_PLOT ); /* トンボ内を塗潰(対象:二値プレーン) */ Lib_paint( (AnteApex[0].x + AnteApex[2].x)/2, (AnteApex[0].y + AnteApex[2].y)/2, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level ); } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** トンボ描画 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (自動描画) * *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 図1 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 0=4---◎------@---1 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** F A *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** E B *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 3---D------C---2 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 図2 図3 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 0=12----1 0 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 10----11 2----3 | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | 3---------------2 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 9----8 5----4 | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | | | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 7----6 | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 1 *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ static void fnCrossAt( level, width ) int level; int width; { int i; int dx, dy; int DPosX, DPosY; double Dist; double dWidth; double RatioX = 1; double RatioY = 1; CPNT_T Mddlp[4]; CPNT_T AnteApex[5], PostApex[4], Posi[8]; CLINE_T B_Side[5]; struct COORDINATES_PAIR Rslt[13]; /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); /* 線幅が1の場合 */ if( 1 == width ) { /* 指定描画数分のループ */ for( dy = 0; dy < iAutoYmax; dy++ ) { for( dx = 0; dx < iAutoXmax; dx++ ) { /* 構造体の変更(ID_BOX→CPNT_T) */ for( i = 0; i < 5; i++ ) { AnteApex[i].x = tABox[dx][dy].pnt[i].x; AnteApex[i].y = tABox[dx][dy].pnt[i].y; AnteApex[i].wScale = 1; } /* 矩形各辺の中心点の取得 */ Lib_clp_center_2Point( AnteApex[0], AnteApex[1], &Mddlp[0], &Dist ); Lib_clp_center_2Point( AnteApex[2], AnteApex[3], &Mddlp[1], &Dist ); Lib_clp_center_2Point( AnteApex[1], AnteApex[2], &Mddlp[2], &Dist ); Lib_clp_center_2Point( AnteApex[3], AnteApex[4], &Mddlp[3], &Dist ); /* トンボ描画 */ Lib_xgline( iDrawMem, level, Mddlp[0].x, Mddlp[0].y, Mddlp[1].x, Mddlp[1].y ); Lib_xgline( iDrawMem, level, Mddlp[2].x, Mddlp[2].y, Mddlp[3].x, Mddlp[3].y ); } } } /* 線幅が1でない場合 */ else { dWidth = (double)width + 1; /* 指定描画数分のループ */ for( dy = 0; dy < iAutoYmax; dy++ ) { for( dx = 0; dx < iAutoXmax; dx++ ) { /* 構造体の変更(ID_BOX→CPNT_T) */ for( i = 0; i < 5; i++ ) { AnteApex[i].x = tABox[dx][dy].pnt[i].x; AnteApex[i].y = tABox[dx][dy].pnt[i].y; AnteApex[i].wScale = 1; } /* 初期化 */ for( i = 0; i < 5; i++ ) { B_Side[i].a = 0; B_Side[i].b = 0; B_Side[i].c = 0; } for( i = 0; i < 4; i++ ) { PostApex[i].x = 0; PostApex[i].y = 0; PostApex[i].wScale = 1; } for( i = 0; i < 8; i++ ) { Posi[i].x = 0; Posi[i].y = 0; Posi[i].wScale = 1; } for( i = 0; i < 13; i++ ) { Rslt[i].x = 0; Rslt[i].y = 0; } /* 矩形の重心の取得 */ DPosX = (AnteApex[0].x + AnteApex[2].x)/2; DPosY = (AnteApex[0].y + AnteApex[2].y)/2; /* 横方向長さの取得 */ Lib_clp_center_2Point( AnteApex[0], AnteApex[1], &Mddlp[0], &Dist ); Dist = XXu_dabs( Dist ); /* 線幅の横方向長さに対する比率の取得 */ RatioX = dWidth / Dist; /* 縦方向長さの取得 */ Lib_clp_center_2Point( AnteApex[1], AnteApex[2], &Mddlp[0], &Dist ); Dist = XXu_dabs( Dist ); /* 線幅の縦方向長さに対する比率の取得 */ RatioY = dWidth / Dist; if( RatioX <= 0 ) RatioX = 0; if( RatioY <= 0 ) RatioY = 0; /* 図1の0〜4より図1の◎〜F(=図2の0,1,3,4,6,7,9,10,12)の算出 */ for( i = 0; i < 4; i++ ) { /* 図1各辺の中心点取得 */ Lib_clp_center_2Point( AnteApex[i], AnteApex[i+1], &Mddlp[0], &Dist ); /* 各点の算出 */ if ( 0 == i || 2 == i ) { Posi[ i*2 ].x = Mddlp[0].x + ( AnteApex[i].x - Mddlp[0].x) * RatioX; Posi[ i*2 ].y = Mddlp[0].y + ( AnteApex[i].y - Mddlp[0].y) * RatioX; Posi[i*2 + 1].x = Mddlp[0].x + ( AnteApex[i+1].x - Mddlp[0].x) * RatioX; Posi[i*2 + 1].y = Mddlp[0].y + ( AnteApex[i+1].y - Mddlp[0].y) * RatioX; Rslt[ i*3 ].x = Mddlp[0].x + ( AnteApex[i].x - Mddlp[0].x) * RatioX; Rslt[ i*3 ].y = Mddlp[0].y + ( AnteApex[i].y - Mddlp[0].y) * RatioX; Rslt[i*3 + 1].x = Mddlp[0].x + ( AnteApex[i+1].x - Mddlp[0].x) * RatioX; Rslt[i*3 + 1].y = Mddlp[0].y + ( AnteApex[i+1].y - Mddlp[0].y) * RatioX; } else { Posi[ i*2 ].x = Mddlp[0].x + ( AnteApex[i].x - Mddlp[0].x) * RatioY; Posi[ i*2 ].y = Mddlp[0].y + ( AnteApex[i].y - Mddlp[0].y) * RatioY; Posi[i*2 + 1].x = Mddlp[0].x + ( AnteApex[i+1].x - Mddlp[0].x) * RatioY; Posi[i*2 + 1].y = Mddlp[0].y + ( AnteApex[i+1].y - Mddlp[0].y) * RatioY; Rslt[ i*3 ].x = Mddlp[0].x + ( AnteApex[i].x - Mddlp[0].x) * RatioY; Rslt[ i*3 ].y = Mddlp[0].y + ( AnteApex[i].y - Mddlp[0].y) * RatioY; Rslt[i*3 + 1].x = Mddlp[0].x + ( AnteApex[i+1].x - Mddlp[0].x) * RatioY; Rslt[i*3 + 1].y = Mddlp[0].y + ( AnteApex[i+1].y - Mddlp[0].y) * RatioY; } } /* 図2の内側4点(2,5,8,11)算出の為のライン算出 */ /* ([]内番号がが図1の○内番号に対応) */ Lib_clp_line_2Point( Posi[0], Posi[5], &B_Side[0], &Dist ); Lib_clp_line_2Point( Posi[2], Posi[7], &B_Side[1], &Dist ); Lib_clp_line_2Point( Posi[1], Posi[4], &B_Side[2], &Dist ); Lib_clp_line_2Point( Posi[3], Posi[6], &B_Side[3], &Dist ); Lib_clp_line_2Point( Posi[0], Posi[5], &B_Side[4], &Dist ); /* 上記ラインの交点の算出 */ for( i = 0; i < 4; i++ ) Lib_clp_cross_2LineC( B_Side[i], B_Side[i+1], &PostApex[i], &Dist ); /* 図2の内側4点の位置取得 */ Rslt[11].x = PostApex[0].x; Rslt[11].y = PostApex[0].y; Rslt[ 2].x = PostApex[1].x; Rslt[ 2].y = PostApex[1].y; Rslt[ 5].x = PostApex[2].x; Rslt[ 5].y = PostApex[2].y; Rslt[ 8].x = PostApex[3].x; Rslt[ 8].y = PostApex[3].y; /* 図2の12の位置取得 */ Rslt[12].x = Rslt[0].x; Rslt[12].y = Rslt[0].y; /* 図2のようにトンボを描画 */ Lib_plot( 13, Rslt, GRAPH_DRAW, LINE_PLOT ); /* トンボ内を塗潰(対象:二値プレーン) */ Lib_paint( DPosX, DPosY, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); /* トンボの消去 */ Lib_plot( 13, Rslt, GRAPH_ERAS, LINE_PLOT ); } } /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level ); } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 円の線幅選択 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnCrclWSet( ) { /* 円の線幅設定 */ iCircleW = (int)Lib_get_value_by_ten_keyboad( 20, 100, iCircleW, 1, 50 ); /* 円の線幅表示 */ Lib_sprintf( baStr, "%d ", iCircleW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 5, MN_MENU_2_YE - 3, baStr ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 円描画 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnCirclDrw( mode, level, width ) int mode; /*0(OFF):塗りつぶさない、1(ON):塗りつぶす*/ int level; /*描画濃度レベル*/ int width; /*modeがOFF時の描画幅*/ { int i; int x, y, r; /* 画像のバックアップ */ fnBackUp( ); /* 画像サイズの取得 */ x = Lib_get_dx_size()/2; y = Lib_get_dy_size()/2; /* 半径の初期値 */ r = 1; /* 円の設定 */ XXcircle_set( &x, &y, &r, ON ); /* 塗潰無しの場合 */ if ( OFF == mode ) { /* 円の描画(線幅分だけ) */ for ( i=0; i MENU_E_XS && xpos < MENU_E_XE && ypos > MENU_E_YS && ypos < MENU_E_YE ) break; } /* キャンセルキー押下時の処理 */ else if ( CURSOR_CANCEL == sts ) { /* 描画濃度レベル更新 */ fnDrwLvMdf( xpos, ypos ); } } } /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** グラデーション濃度選択 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnGrdLvSet( ) { int no; int pad_level; PVAL value[2]; /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドのタイトル */ Lib_view_set_title( pad_level, SetGradLvMenu[0][iLanguage] ); /* メニューの登録 */ Lib_view_set_uniq_numeral( pad_level, 5, 5, SetGradLvMenu[1][iLanguage], iInnerGrdLv, 0, 255, 0 ); Lib_view_set_uniq_numeral( pad_level, 5, 35, SetGradLvMenu[2][iLanguage], iOuterGrdLv, 0, 255, 1 ); /* パッドの表示位置の取得 */ Lib_view_set_size( pad_level, 100, 130, 35, 5 ); /* メニューの表示 */ Lib_draw_menu( pad_level ); /* メニュー値の取得 */ if( ERROR_RETURN != ( no = Lib_process_menu( pad_level, value ) ) ) { switch( no ) { case 101: /*「実行」が選択された */ iInnerGrdLv = value[0].value_type; iOuterGrdLv = value[1].value_type; break; case 102: /*「取り消し」が選択された */ break; } }/* パッドの消去 */ Lib_erase_menu( pad_level ); /* パッドのクローズ */ Lib_view_close( pad_level ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** グラデーション描画(矩形) ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** 図1(描画エリア) *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ---------------- *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |\← B →/| *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |↑\ /↑| *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | \ / | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |@ × ◎| *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** | / \ | *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |↓/ \↓| *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** |/← A →\| *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ---------------- *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ static void fnGrdBox( inner, outer ) int inner; /*描画半径*/ int outer; /*描画半径*/ { int i; int iLevel; int xs, ys, xe, ye; int iCenterX, iCenterY, iHSideX, iHSideY, iDdist, iPosSX, iPosSY, iPosEX, iPosEY; double dAngle; double dInner, dOuter, dHSideX, dHSideY, dDdist; ID_BOX GrdBox; /* グラデーションBOX位置 */ CPNT_T Apex[BOX_PLOT_NO]; CLINE_T line1, line2; /* 画像のバックアップ */ fnBackUp( ); /* 画像全体の中心位置 */ iCenterX = Lib_get_dx_size()/2; iCenterY = Lib_get_dy_size()/2; /* 濃度レベルの設定 */ if( inner < outer ) iLevel = inner; else iLevel = outer; dInner = (double)inner; dOuter = (double)outer; /* BOX設定 */ XXbox_set( &xs, &ys, &xe, &ye, ON ); /* BOX設定より各頂点情報の取得 */ GrdBox.pnt[0].x = GrdBox.pnt[4].x = xs; GrdBox.pnt[0].y = GrdBox.pnt[4].y = ys; GrdBox.pnt[1].x = xe; GrdBox.pnt[1].y = ys; GrdBox.pnt[2].x = xe; GrdBox.pnt[2].y = ye; GrdBox.pnt[3].x = xs; GrdBox.pnt[3].y = ye; /* BOX中心の算出 */ iCenterX = (xs + xe)/2; iCenterY = (ys + ye)/2; /* BOXの大きさ取得 */ iHSideX = XXu_abs( (xs - xe) / 2 ); iHSideY = XXu_abs( (ys - ye) / 2 ); dHSideX = (double)iHSideX; dHSideY = (double)iHSideY; /* 構造体の変更(ID_BOX→CPNT_T) */ for( i = 0; i < 5; i++ ) { Apex[i].x = GrdBox.pnt[i].x; Apex[i].y = GrdBox.pnt[i].y; Apex[i].wScale = 1; } /* BOXの対角線を取得 */ Lib_clp_line_2Point( Apex[0], Apex[2], &line1, &dAngle ); Lib_clp_line_2Point( Apex[1], Apex[3], &line2, &dAngle ); /* 中心を描画 */ Lib_xgline( iDrawMem, inner, iCenterX, iCenterY, iCenterX, iCenterY ); /* 図1◎@エリア描画 */ /* グラデーション描画 */ for ( iDdist=1; iDdist < iHSideX; iDdist++ ) { /* 中心から描画ラインまでの距離取得 */ dDdist = (double)iDdist; /* 描画濃度レベルの設定 */ iLevel = XXd4i5_d( dInner + ((dOuter - dInner) * dDdist) / dHSideX ); /* ◎エリア */ /* 描画ラインの設定 */ iPosSX = iCenterX + iDdist; iPosEX = iCenterX + iDdist; iPosSY = ( -line1.a * iPosSX - line1.c * 4096 ) / line1.b; iPosEY = ( -line2.a * iPosEX - line2.c * 4096 ) / line2.b; /* ライン描画 */ Lib_xgline( iDrawMem, iLevel, iPosSX, iPosSY, iPosEX, iPosEY ); /* @エリア */ /* 描画ラインの設定 */ iPosSX = iCenterX - iDdist; iPosEX = iCenterX - iDdist; iPosSY = ( -line1.a * iPosSX - line1.c * 4096 ) / line1.b; iPosEY = ( -line2.a * iPosEX - line2.c * 4096 ) / line2.b; /* ライン描画 */ Lib_xgline( iDrawMem, iLevel, iPosSX, iPosSY, iPosEX, iPosEY ); } /* 図1ABエリア描画 */ /* グラデーション描画 */ for ( iDdist=1; iDdist < iHSideY; iDdist++ ) { /* 中心から描画ラインまでの距離取得 */ dDdist = (double)iDdist; /* 描画濃度レベルの設定 */ iLevel = XXd4i5_d( dInner + ((dOuter - dInner) * dDdist) / dHSideY ); /* Aエリア */ /* 描画ラインの設定 */ iPosSY = iCenterY + iDdist; iPosEY = iCenterY + iDdist; iPosSX = ( -line1.b * iPosSY - line1.c * 4096 ) / line1.a; iPosEX = ( -line2.b * iPosEY - line2.c * 4096 ) / line2.a; /* ライン描画 */ Lib_xgline( iDrawMem, iLevel, iPosSX, iPosSY, iPosEX, iPosEY ); /* Bエリア */ /* 描画ラインの設定 */ iPosSY = iCenterY - iDdist; iPosEY = iCenterY - iDdist; iPosSX = ( -line1.b * iPosSY - line1.c * 4096 ) / line1.a; iPosEX = ( -line2.b * iPosEY - line2.c * 4096 ) / line2.a; /* ライン描画 */ Lib_xgline( iDrawMem, iLevel, iPosSX, iPosSY, iPosEX, iPosEY ); } /* 最大値フィルター */ Lib_max_filter( iDrawMem, iChrgMem ); /* 最小値フィルター */ Lib_min_filter( iChrgMem, iDrawMem ); /* モニタ表示 */ Lib_xvideo_transmit( iDrawMem, GRAY_PLANE ); /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** グラデーション描画(円) ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnGrdCircl( inner, outer ) int inner; /*描画半径*/ int outer; /*描画半径*/ { int iDRad; int iLevel; int iCenterX, iCenterY, iRadius; double dDRad, dRadius, dInner, dOuter; /* 画像のバックアップ */ fnBackUp( ); /* 画像全体の中心位置 */ iCenterX = Lib_get_dx_size()/2; iCenterY = Lib_get_dy_size()/2; /* 半径の初期化 */ iRadius = 1; /* 濃度レベルの設定 */ dInner = (double)inner; dOuter = (double)outer; if( inner < outer ) iLevel = inner; else iLevel = outer; /* 円の設定 */ XXcircle_set( &iCenterX, &iCenterY, &iRadius, ON ); /* 円描画(最小値で円内を塗潰す) */ Lib_drawcircle( iCenterX, iCenterY, iRadius ); Lib_paint( iCenterX-iRadius/2, iCenterY-iRadius/2, WHITE_COLOR, WHITE_COLOR, BIN_PLANE ); fnBinToGray( iBinMem, iDrawMem, iLevel ); /* 型変換 */ dRadius = (double)iRadius; /* 中心を描画 */ Lib_xgline( iDrawMem, inner, iCenterX, iCenterY, iCenterX, iCenterY ); /* グラデーション描画 */ for ( iDRad=1; iDRad < iRadius; iDRad++ ) { /* 半径の取得 */ dDRad = (double)iDRad; /* 描画レベルの取得 */ iLevel = XXd4i5_d( dInner + ((dOuter - dInner) * dDRad) / dRadius ); /* 円描画 */ Lib_xgcircle( iDrawMem, iLevel, iCenterX, iCenterY, iDRad ); } /* 最大値フィルター */ Lib_max_filter( iDrawMem, iChrgMem ); /* 最小値フィルター */ Lib_min_filter( iChrgMem, iDrawMem ); /* モニタ表示 */ Lib_xvideo_transmit( iDrawMem, GRAY_PLANE ); /* クリア */ Lib_memory_clear( LINE_PLANE | BIN_PLANE ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** フリークリア線幅選択 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnErasWSet( ) { /* フリークリア線幅設定 */ iEraserW = (int)Lib_get_value_by_ten_keyboad( 20, 100, iEraserW, 1, 50 ); /* フリークリア線幅表示 */ Lib_sprintf( baStr, "R%d ", iEraserW ); Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, MN_MENU_2_XE + 5, MN_MENU_7_YE - 3, baStr ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 消しゴム ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnEraser( width ) int width; /*描画円の半径 */ { int i; int sts; int xpos; int ypos; int s_xpos; int s_ypos; /* 画像のバックアップ */ fnBackUp( ); /* 処理終了判定用キーの表示 */ Lib_display_key( 445, 0, DisplayComment[ 0][iLanguage], 1 ); /* カーソルの初期位置 */ s_xpos = xpos = Lib_get_dx_size()/2; s_ypos = ypos = Lib_get_dy_size()/2; /* カーソル位置と濃度レベルの表示 */ Lib_sprintf( baStr, "(%3d, %3d) LEVEL=%3d", xpos, ypos, iClsLv ); Lib_chrdisp( 1, 30, baStr ); /* カーソル移動 */ Lib_move_cursor( s_xpos, s_ypos ); /* タイムディレイ */ Lib_time_delay( 500 ); for (;;) { /* カーソル位置読みとり */ sts = 0; sts = Lib_see_current_position_real( &xpos, &ypos ); /* カーソル位置と濃度レベルの表示 */ Lib_sprintf( baStr, "(%3d, %3d) LEVEL=%3d", xpos, ypos, iClsLv ); Lib_chrdisp( 1, 30, baStr ); /* カーソル位置が移動した場合 */ if ( s_xpos != xpos || s_ypos != ypos ) { /* カーソル移動 */ Lib_move_cursor( xpos, ypos ); s_xpos = xpos; s_ypos = ypos; /* 実行押下時の処理 */ if ( CURSOR_EXECUTE == sts ) { /* 中心点描画 */ Lib_xgline( iDrawMem, iClsLv, xpos, ypos, xpos, ypos ); /* 設定線幅の円クリア */ for ( i=0; i MENU_E_XS && xpos < MENU_E_XE && ypos > MENU_E_YS && ypos < MENU_E_YE ) break; } } } /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** spline ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (スプライン描画) * *********** ********* ******* ***** *** */ double fnSpline( double t, double x[], double y[], double z[], int N ) { int i, j, k; double d, h, period; period = x[N] - x[0]; while ( t > x[N] ) t -= period; while ( t < x[0] ) t += period; i = 0; j = N; while ( i < j ) { k = ( i + j ) / 2; if ( x[k] < t ) i = k + 1; else j = k; } if ( i > 0 ) i--; h = x[i + 1] - x[i]; d = t - x[i]; return (((z[i + 1] - z[i]) * d / h + z[i] * 3) * d + ((y[i + 1] - y[i]) / h - (z[i] * 2 + z[i + 1]) * h)) * d + y[i]; } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** fnSpline2 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (スプライン描画) * *********** ********* ******* ***** *** */ static void fnSpline2( double t, double *px, double *py, double p[], double x[], double y[], double a[], double b[], int N ) { *px = fnSpline( t, p, x, a, N ); *py = fnSpline( t, p, y, b, N ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** fnSpMkTable ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (スプライン描画) * *********** ********* ******* ***** *** */ static void fnSpMkTable( double x[], double y[], double z[], int N ) { int i; double t; static double h[MAX_DOT_NO + 1], d[MAX_DOT_NO + 1], w[MAX_DOT_NO + 1]; for ( i = 0; i < N; i++ ) { h[i] = x[i + 1] - x[i]; w[i] = (y[i + 1] - y[i]) / h[i]; } w[N] = w[0]; for ( i = 1; i < N; i++) d[i] = 2 * (x[i + 1] - x[i - 1] ); d[N] = 2 * (h[N - 1] + h[0] ); for ( i = 1; i <= N; i++ ) z[i] = w[i] - w[i - 1]; w[1] = h[0]; w[N - 1] = h[N - 1]; w[N] = d[N]; for ( i = 2; i < N - 1; i++ ) w[i] = 0; for ( i = 1; i < N; i++ ) { t = h[i] / d[i]; z[i + 1] = z[i + 1] - z[i] * t; d[i + 1] = d[i + 1] - h[i] * t; w[i + 1] = w[i + 1] - w[i] * t; } w[0] = w[N]; z[0] = z[N]; for ( i = N - 2; i >= 0; i-- ) { t = h[i] / d[i + 1]; z[i] = z[i] - z[i + 1] * t; w[i] = w[i] - w[i + 1] * t; } t = z[0] / w[0]; z[0] = t; z[N] = t; for ( i = 1; i < N; i++ ) z[i] = (z[i] - w[i] * t) / d[i]; } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** fnSpMkTable2 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (スプライン描画) * *********** ********* ******* ***** *** */ static void fnSpMkTable2( double p[], double x[], double y[], double a[], double b[], int N ) { int i; double t1, t2; p[0] = 0; for ( i = 1; i <= N; i++ ) { t1 = x[i] - x[i - 1]; t2 = y[i] - y[i - 1]; p[i] = p[i - 1] + sqrt( t1 * t1 + t2 * t2 ); } for ( i = 1; i <= N; i++ ) p[i] /= p[N]; fnSpMkTable( p, x, a, N ); fnSpMkTable( p, y, b, N ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** スプライン描画 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (スプライン描画) * *********** ********* ******* ***** *** */ double p[MAX_DOT_NO + 1], a[MAX_DOT_NO + 1], b[MAX_DOT_NO + 1]; static void fnSplineDraw( SpDotNo, x, y, SpDrawStep, width ) int SpDotNo; /*入力:入力点数 */ double x[]; /*入力:座標群x */ double y[]; /*入力:座標群y */ int SpDrawStep; /*入力:ステップ数 */ int width; { int i, j; double u, v; int iu, iv; double pitch; int N; N = SpDotNo; fnSpMkTable2( p, x, y, a, b, N ); pitch = (double)( 1.0 / SpDrawStep ); for ( i = 0; i <=SpDrawStep ; i++ ) { fnSpline2( pitch*i, &u, &v, p, x, y, a, b, N ); iu = XXd4i5_d( u ); iv = XXd4i5_d( v ); for ( j=0; j> BitData ) ) ) { #else if( OFF !=( AccData & ( 0x80 >> BitData ) ) ) { #endif /* 指定位置 */ #ifdef __CSC903__ BaseX = x + ((Pos % (iBlock * STR_ACC_BIT)) * size); BaseY = y + ((Pos / (iBlock * STR_ACC_BIT)) * size); #elif defined __CSC904__ BaseX = x + ((Pos % (iBlock * STR_ACC_BIT)) * size); BaseY = y + ((Pos / (iBlock * STR_ACC_BIT)) * size); #else BaseX = x + ((Pos % iSizeX) * size); BaseY = y + ((Pos / iSizeX) * size); #endif /* 指定倍率エリア */ for( YLmt = 0; YLmt < size; YLmt++ ) { for( XLmt = 0; XLmt < size; XLmt++ ) { BlcMem = ( ((BaseY + YLmt) * SX) + (BaseX + XLmt) ) / ACCESS_BITS; BitMem = ( ((BaseY + YLmt) * SX) + (BaseX + XLmt) ) % ACCESS_BITS; AccMem = *( BaseMem + BlcMem ); if( 0 != ( AccMem & ( 0x80000000 >> BitMem ) ) ) { /* 処理無し */ } else { /* 白にする */ trc = ( 0x80000000 >> BitMem ); *( BaseMem + BlcMem ) |= trc; } } } } } /* 二値プレーン上の内容をグレイメモリに指定濃度で描画 */ fnBinToGray( iBinMem, iDrawMem, level ); /* 画面表示 */ Lib_xvideo_transmit( iDrawMem, GRAY_PLANE ); /* 退避領域の開放 */ Lib_lfree( TopData ); } } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 文字列の設定 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (文字列描画) * *********** ********* ******* ***** *** */ static void fnCharactr( type, size, step, level ) int type; int size; int step; int level; { int sts; int x, y; int flag; int xpos, ypos; int Xsize, Ysize; int s_xpos, s_ypos; char DispStr[20]; /* フラッグの初期化 */ flag = DO_EXE; /* 文字列の初期化 */ strcpy( DispStr, "FAST.CORP" ); /* 文字列の取得 */ Lib_get_string_by_keyboad( 50, 200, 12, DispStr ); /* 文字列のサイズ取得 */ fnCharSize( step, DispStr, &Xsize, &Ysize ); /* エラー処理 */ if( 0 == Xsize || 0 == Ysize) Lib_display_message( 100, 200, ErrorComment[0][iLanguage], ErrorComment[6][iLanguage] ); /* 文字表示位置取得 */ else { /* カーソルを(0,0)へ移動 */ s_xpos = xpos = 0; s_ypos = ypos = 0; Lib_move_cursor( xpos, ypos ); /* コメント */ Lib_kanjishift( NORMAL_FONT, NORMAL_FONT, 0, DSP_COM_PX, DSP_COM_PY, ErrorComment[5][iLanguage] ); /* ループ */ for (;;) { /* カーソル位置読みとり */ sts = 0; sts = Lib_see_current_position( &xpos, &ypos ); /* カーソル位置が移動した場合 */ if ( s_xpos != xpos || s_ypos != ypos ) { /* カーソル移動 */ Lib_move_cursor( xpos, ypos ); /* カーソル位置のクリア */ Lib_chrdisp( 1, 30, "      " ); /* 前の文字位置BOXを消去 */ Lib_box( s_xpos, s_ypos, s_xpos + Xsize * size, s_ypos - Ysize * size, 0x00000000 ); /* 文字位置BOXを描画 */ Lib_box( xpos, ypos, xpos + Xsize * size, ypos - Ysize * size, SOLID_LINE ); /* カーソル位置の表示 */ Lib_sprintf( baStr, "(%3d, %3d)", xpos, ypos ); Lib_chrdisp( 1, 30, baStr ); s_xpos = xpos; s_ypos = ypos; } /* 実行押下時の処理 */ if ( CURSOR_EXECUTE == sts ) { /* 表示位置の取得 */ x = xpos; y = ypos; /* カーソル位置のクリア */ Lib_chrdisp( 1, 30, " " ); /* 文字表示範囲が画面外の場合の処理 */ if ( 512 < (x + Xsize * size) || (y - Ysize * size) < 0 ) { Lib_display_message( 100, 200, ErrorComment[0][iLanguage], ErrorComment[7][iLanguage] ); flag = NO_EXE; } break; } /* 実行押下時の処理 */ else if ( CURSOR_CANCEL == sts ) { flag = NO_EXE; break; } } /* 文字描画実行 */ if ( DO_EXE == flag ) { /* 画像のバックアップ */ fnBackUp( ); /* 文字描画 */ fnCharDraw( type, size, step, x, y - (15*size), DispStr, GRAY_PLANE, level ); } /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE | BIN_PLANE ); } } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 文字列の設定 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * (文字列描画) * *********** ********* ******* ***** *** */ static void fnCharSet( ) { int no; int pad_level; PVAL value[3]; /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドのタイトル */ Lib_view_set_title( pad_level, SetDrawCharMenu[0][iLanguage] ); /* メニューの登録 */ Lib_view_set_select ( pad_level, 5, 5, SetDrawCharMenu[1][iLanguage], iFntType, 2, FontSelec[iLanguage], 0 ); Lib_view_set_uniq_numeral( pad_level, 5, 35, SetDrawCharMenu[2][iLanguage], iFntSize, 1, 10, 1 ); Lib_view_set_uniq_numeral( pad_level, 5, 65, SetDrawCharMenu[3][iLanguage], iFntStep, 0, 15, 2 ); /* パッドの表示位置の取得 */ Lib_view_set_size( pad_level, 100, 130, 35, 5 ); /* メニューの表示 */ Lib_draw_menu( pad_level ); /* メニュー値の取得 */ if( ERROR_RETURN != ( no = Lib_process_menu( pad_level, value ) ) ) { switch( no ) { case 101: /*「実行」が選択された */ iFntType = value[0].select_type; iFntSize = value[1].value_type; iFntStep = value[2].value_type; break; case 102: /*「取り消し」が選択された */ break; } }/* パッドの消去 */ Lib_erase_menu( pad_level ); /* パッドのクローズ */ Lib_view_close( pad_level ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 画像変換 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnImgChng( ) { int no; int FLAG = LOOP; int iPadLevel; /* パッドのオープン */ iPadLevel = Lib_view_open( ); /* パッドタイトルの設定 */ Lib_view_set_title( iPadLevel, ImgChngMenu[ 0][iLanguage] ); /* メニューの登録 */ Lib_view_set_null( iPadLevel, 5, 10, ImgChngMenu[ 1][iLanguage], 0 ); /* パッドの表示位置の取得 */ Lib_view_set_size( iPadLevel, 200, 200, 5, 5 ); /* パッドの表示 */ Lib_draw_command( iPadLevel ); while( FLAG ) { /* メニュー値の取得 */ if( ERROR_RETURN != ( no = Lib_process_command( iPadLevel ) ) ) { switch( no ) { case 0 : Lib_erase_command( iPadLevel ); /* 画像回転 */ fnImgRota( ); Lib_draw_command( iPadLevel ); break; case 102 : FLAG = EXIT; break; } } else Lib_chrdisp( 1, 28, ErrorComment[0][iLanguage] ); } /* パッドの消去 */ Lib_erase_command( iPadLevel ); /* パッドのクローズ */ Lib_view_close( iPadLevel ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** 画像回転 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnImgRota( ) { int no; int pad_level; PVAL value[2]; /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドのタイトル */ Lib_view_set_title( pad_level, RotationMenu[0][iLanguage] ); /* メニューの登録 */ Lib_view_set_uniq_numeral( pad_level, 5, 5, RotationMenu[1][iLanguage], iRotAng, 0, 3600, 0 ); Lib_view_set_point ( pad_level, 5, 35, RotationMenu[2][iLanguage], iRotCnX, iRotCnY, 3, 1 ); /* パッドの表示位置の取得 */ Lib_view_set_size( pad_level, 100, 130, 35, 5 ); /* メニューの表示 */ Lib_draw_menu( pad_level ); /* メニュー値の取得 */ if( ERROR_RETURN != ( no = Lib_process_menu( pad_level, value ) ) ) { switch( no ) { case 101: /*「実行」が選択された */ iRotAng = value[0].value_type; iRotCnX = value[1].point_type.x; iRotCnY = value[1].point_type.y; /* 画像のバックアップ */ fnBackUp( ); /* 画像回転の実行 */ Lib_xrotation( iDrawMem, iChrgMem, iRotAng, iRotCnX, iRotCnY ); /* 画像メモリのコピー */ Lib_gray_memory_move( iChrgMem, iDrawMem, 0xff ); /* モニタ表示 */ Lib_xvideo_transmit( iDrawMem, GRAY_PLANE ); /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE | BIN_PLANE ); break; case 102: /*「取り消し」が選択された */ break; } }/* パッドの消去 */ Lib_erase_menu( pad_level ); /* パッドのクローズ */ Lib_view_close( pad_level ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** バックアップ ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnBackUp( ) { /* やり直し用、画像データのバックアップ */ Lib_gray_memory_move( iDrawMem, iUndoMem, 0xff ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** やり直し(一回) ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnImgUndo( ) { /* バックアップ画像メモリーをカレントメモリーにコピー */ Lib_gray_memory_move( iUndoMem, iDrawMem, 0xff ); /* モニター表示 */ Lib_xvideo_transmit( iDrawMem, GRAY_PLANE ); /* クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE | BIN_PLANE ); } /* *** ***** ******* ********* *********** ****************************************** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ********* ********* *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** ***** クリア描画 ***** *********** ********* ******* ***** *** */ /* *** ***** ******* ********* *********** * * *********** ********* ******* ***** *** */ static void fnClear( level ) int level; /*クリア濃度レベル*/ { int dx, dy; char *base, *wb2; register int i, a; /* 画像のバックアップ */ fnBackUp( ); /* 画像サイズの取得 */ dx = Lib_get_dx_size(); dy = Lib_get_dy_size(); /* 描画メモリの先頭アドレスを取得 */ base = Lib_adrs_gray_memory( iDrawMem ); /* すべて画素をクリアレベルに設定 */ for ( i=0; i