#ifndef __FMGRAPH_
#define __FMGRAPH_

/*--複数パレットを一回の呼び出しで設定するさいのデータ構造体                 */
struct PALETLIST {
    unsigned    size;                   /* データサイズ  6 * 指定パレット数  */
    struct PALETTE {
        unsigned        colorid;        /* 色番号                            */
        unsigned char   reserve;
        unsigned char   red;            /* 赤階調                            */
        unsigned char   green;          /* 緑階調                            */
        unsigned char   blue;           /* 青階調                            */
    }   pltbl[16];
};

/*==グラフィックBIOS初期化 このライブラリを使う際には必ず最初に呼び出すこと  */
void g_init(char far *); /*  作業領域アドレスの指定 先頭１ワードに領域サイズ */
                         /*  −２の値を設定しておく。                        */
                         /*　アドレスが0000:0000ならば、BIOS内のデフォルトを */
                         /*  使用する。                                      */
/*==境界線色                矩形、円、扇形、楕円、楕円扇形などの外枠線の色   */
int  g_bordercolor(unsigned); /*  ハードウェアで指定可能な範囲の値           */

/*==境界線種  */
int  g_borderlineid(char); /* 1〜127のID 1〜5までは初期パターン有り 以後は   */
                           /* ユーザー設定(設定されるまではNULLとなる)       */

/*==境界線モード            外枠線を描画するかどうか                         */
int  g_bordermode(unsigned char);
#define BORDER_DRAW     1  /* 描画する (デフォルト)                          */
#define BORDER_NODRAW   0  /* 描画しない                                     */

/*==矩形  */
int  g_box(int,int,int,int); /* 基点X座標,基点Y座標,対角X座標,対角Y座標      */

/*==図形出力中止  */
void g_break(void);

/*==文字色  */
int  g_charcolor(unsigned);

/*==文字の方向  */
int  g_chardirection(int,int,int,int);
 /* 高さ方向X成分,高さ方向Y成分,幅方向X成分,幅方向X成分      (-1,0,1の範囲?) */
 /* 高さ方向のX成分とY成分はどちらかが0でなければならない。両方が0だとエラー */
 /* 幅方向は両方が0だとエラーだが、両方0以外は良い                           */

/*==文字の扱い  */
int  g_charhandling(unsigned char);
#define HANDLE_STR      0       /* 文字間空白、文字方向、文字列方向を無視し、*/
                                /* 空白無し、文字をXY軸の正方向、文字列を右に*/
                                /* 描画する (デフォルト)                     */
#define HANDLE_CHAR     1       /* 各設定値に従う                            */

/*==文字高さ  */
int  g_charheight(unsigned);

/*==文字間空白          を文字高さに対する比率(分数)で指定する  */
int  g_charspace(unsigned,unsigned); /* 分子,分母                            */

/*==文字幅              を文字高さに対する比率(分数)で指定する  */
int  g_charwidth(unsigned,unsigned); /* 分子,分母                            */

/*==円  */
int  g_circle(int,int,int); /* 中心X座標,中心Y座標,半径                      */

/*==円弧  */
int  g_circle_arc(int,int,int,int,int,int,int);
 /* 中心X座標,中心Y座標,開始軸X成分,開始軸Y成分,終了軸X成分,終了軸Y成分,半径 */

/*==円扇形  */
int  g_circle_sector(int,int,int,int,int,int,int);
 /* 中心X座標,中心Y座標,開始軸X成分,開始軸Y成分,終了軸X成分,終了軸Y成分,半径 */

/*==クリップ枠  */
int  g_clip(int,int,int,int); /* 基点X座標,基点Y座標,対角X座標,対角Y座標     */

/*==クリップモード  */
int  g_clipmode(unsigned char);
#define CLIP_HARD       0       /* 画面枠                                    */
#define CLIP_CLIPFRAME  1       /* クリップ枠 (デフォルト)                   */
#define CLIP_VIEWPORT   2       /* ビューポート                              */

/*==全画面消去  */
void g_cls(void);

/*==色指定のビットイメージ読み出し  */
int  g_colorget(unsigned char far *,unsigned char,int,int,int,int,unsigned,unsigned *);
 /* バッファアドレス,読み出しページ,基点X座標,基点Y座標,対角X座標,対角Y座標, */
 /* 読み出し指定色数(1〜16),指定色配列アドレス                               */

/*==色指定のビットイメージ書き込み  */
int  g_colorput(unsigned char far *,unsigned char,int,int,int,int,unsigned,unsigned char);
 /* バッファアドレス,書き込みページ,基点X座標,基点Y座標,対角X座標,対角Y座標, */
 /* 書き込み色,書き込みモード(描画モードに同じ)                              */

/*==ユーザー座標系設定  */
int  g_coodinate(int,int,int,int); /* 左下X座標,左下Y座標,右上X座標,右上Y座標*/

/*==描画モード  */
int  g_drawmode(unsigned char);
#define DRAW_PRESET     0       /* 背景色で描画する                          */
#define DRAW_AND        1       /* 描画先の色番号と AND する                 */
#define DRAW_PSET       3       /* 指定の色で描画する (デフォルト)           */
#define DRAW_XOR        6       /* 描画先の色番号と XOR する                 */
#define DRAW_OR         7       /* 描画先の色番号と OR する                  */
#define DRAW_NOT        12      /* 文字描画時のみ有効  反転表示を行う        */

/*==グラフィックカーソル表示  */
void g_gcurdisp(unsigned char);
#define GCUR_DISP        0      /* グラフィックカーソルを表示する            */
#define GCUR_NODISP     !0      /* グラフィックカーソルを表示しない          */

/*==グラフィックカーソル形状  */
int  g_gcurform(char,char,unsigned,unsigned,unsigned,unsigned char *,unsigned char *);
 /* カーソル図形内の中心X座標,同Y座標,横ドット数(8の倍数),縦ドット数(1〜32), */
 /* 色番号,ANDパターンアドレス,XORパターンアドレス                           */

/*==グラフィックカーソル位置  */
void g_gcurpos(unsigned,unsigned); /* X座標,Y座標 (ハードウェア座標系)       */

/*==汎用の図形出力  */
int  g_generaloutput(char far *);

/*==全プレーンのビットイメージ読み出し  */
void g_get(unsigned char far *,unsigned char,int,int,int,int);
 /* バッファアドレス,読み出しページ,基点X座標,基点Y座標,対角X座標,対角Y座標, */

/*==バックグラウンドカラー読み出し  */
int  g_getbgcolor(void);

/*==16β互換モードの読み出し  値は設定の方を参照                             */
int  g_getcompatiblemode(void);

/*==表示中ページ番号の読み出し  */
int  g_getdisplaypage(void);

/*==書き込みページ番号の読み出し  */
int  g_getdrawpage(void);

/*==使用可能ページ数の読み出し  */
int  g_geteffectpage(void);

/*==ハッチング種別指定  */
int  g_hatchid(char);      /* 1〜127のID 1〜6までは初期パターン有り 以後は   */
                           /* ユーザー設定(設定されるまではNULLとなる)       */

/*==ハッチングパターン設定  */
int  g_hatchpattern(char,unsigned,unsigned char *);
 /* パターンID,縦ドット数(1〜20),パターンデータ配列アドレス                  */

/*==線分  */
int  g_line(int,int,int,int); /* 始点X座標,始点Y座標,終点X座標,終点Y座標     */

/*==線分色  */
int  g_linecolor(unsigned);

/*==線分種別指定  */
int  g_lineid(char); /* 境界線種別に同じ                                     */

/*==線分パターン設定その１  */
int  g_linepattern(char,unsigned); /* パターンID,パターンデータ(16ビット)    */

/*==線分パターン設定その２  */
int  g_linepattern2(char,unsigned char,unsigned char);
 /* パターンID,パターンデータ１(初めの8ビット),パターンデータ２(後の8ビット) */

/*==パレット設定(複数)  */
void g_multipalette(struct PALETLIST far *); /* パレット指定データのアドレス */

/*==楕円  */
int  g_oval(int,int,int,int); /* 中心X座標,中心Y座標,X方向半径,Y方向半径     */

/*==楕円弧  */
int  g_oval_arc(int,int,int,int,double,double);
 /* 中心X座標,中心Y座標,X方向半径,Y方向半径,開始角(ﾗｼﾞｱﾝ),終了角(ﾗｼﾞｱﾝ)      */
 /* 使用するのに mathlib.lib が必要である                                    */

/*==楕円扇形  */
int  g_oval_sector(int,int,int,int,double,double);
 /* 中心X座標,中心Y座標,X方向半径,Y方向半径,開始角(ﾗｼﾞｱﾝ),終了角(ﾗｼﾞｱﾝ)      */
 /* 使用するのに mathlib.lib が必要である                                    */

/*==ペイント  */
int  g_paint(int,int,unsigned,unsigned *);
 /* 中心X座標,中心Y座標,境界色数(1〜16),境界色配列アドレス                   */

/*==ペイント色  */
int  g_paintcolor(unsigned);

/*==ペイントモード ペイントや矩形、円、扇形、楕円、楕円扇形描画時の面塗り指定*/
int  g_paintmode(unsigned char);
#define PAINT_NO        0       /* 塗り潰しをしない (デフォルト)             */
#define PAINT_FILL      1       /* ベタ塗り                                  */
#define PAINT_TILE      2       /* タイル塗り                                */
#define PAINT_HATCH     3       /* ハッチング塗り                            */

/*==パレット設定(単独)  */
void g_palette(unsigned,unsigned char,unsigned char,unsigned char);
 /* 色番号,赤階調,緑階調,青階調                                              */

/*==部分画面消去  */
void g_partclear(unsigned char,int,int,int,int);
 /* 対象ページ番号,基点X座標,基点Y座標,対角X座標,対角Y座標                   */

/*==部分画面複写  */
int  g_partcopy(unsigned char,int,int,int,int,unsigned char,int,int,unsigned char);
 /* 複写元ページ番号,基点X座標,基点Y座標,対角X座標,対角Y座標,                */
 /* 複写先ページ番号,基点X座標,基点Y座標,書き込みモード(描画モードに同じ)    */

/*==使用プレーン数設定  */
void g_plane(unsigned char);

/*==点色  */
int  g_pointcolor(unsigned);

/*==点  */
int  g_pset(int,int); /* 描画X座標,描画Y座標                                 */

/*==全プレーンのビットイメージ書き込み  */
int  g_put(unsigned char far *,unsigned char,int,int,int,int,unsigned char);
 /* バッファアドレス,書き込みページ,基点X座標,基点Y座標,対角X座標,対角Y座標, */
 /* 書き込みモード(描画モードに同じ)                                         */

/*==解像度の設定  */
int  g_resolution(unsigned,unsigned); /* 水平ドット数,垂直ドット数           */

/*==スクロール  */
void g_scroll(int,int); /* 水平移動ドット数,垂直移動ドット数                 */

/*==バックグラウンドカラー設定  */
void g_setbgcolor(int);

/*==16β互換モードの設定  */
void g_setcompatiblemode(unsigned char);
#define COMPATI_BETA    0       /* 16β互換モード                            */
#define COMPATI_EXTD    1
                      /* 拡張モード(読み出し時の値、設定時は0以外ならば良い) */

/*==表示ページの設定  */
void g_setdisplaypage(unsigned char);

/*==書き込みページの設定  */
void g_setdrawpage(unsigned char);

/*==文字列描画の方向  */
int  g_strdirection(unsigned char);
#define DIRECT_RIGHT    0       /* 右                                        */
#define DIRECT_LEFT     1       /* 左                                        */
#define DIRECT_UP       2       /* 上                                        */
#define DIRECT_DOWN     3       /* 下                                        */

/*==文字列出力          MAX 255バイト                                        */
int  g_string(int,int,unsigned char,char far *);
 /* 開始X座標,開始Y座標,継続フラグ,文字列アドレス                            */
 /* 開始XY座標は、文字の左下角の座標である                                   */
 /* 使用するのに farstr.lib が必要である                                     */
#define STR_CONTINUE    1       /* この文字列描画の後に、継続描画する文字あり*/
#define STR_STOP        0       /* 継続描画する文字なし                      */

/*==継続した文字列出力  MAX 255バイト                                        */
int  g_string_cont(unsigned char,char far *); /* 継続フラグ,文字列アドレス   */
 /* 使用するのに farstr.lib が必要である                                     */

/*==タイリング種別指定  */
int  g_tileid(char); /* 1〜127のID 初期パターンは無し                        */

/*==タイリングパターンの設定その１  */
int  g_tilepattern(char,unsigned,unsigned char *,unsigned char *,unsigned char *,unsigned char *);
 /* パターンID,縦ドット数(1〜32),プレーン０データ配列アドレス,               */
 /* 以下プレーン１〜３データ配列アドレス、と続く                             */

/*==タイリングパターンの設定その２  */
int  g_tilepattern2(char,unsigned,unsigned *);
 /* パターンID,縦ドット数(1〜16),色番号データ配列アドレス                    */

/*==ビューポートの設定  */
int  g_viewport(int,int,int,int); /* 基点X座標,基点Y座標,対角X座標,対角Y座標 */

#endif
