グラフ関数電卓 fx-9860G SDK (グラフィック表示)

2013/03/27

◆ グラフィック表示

SDKライブラリのグラフィック命令を見るとVRAMを操作する命令とDD(ディスプレイドライバ)を操作する命令がある。

Bdisp_AllClr_DD(); を実行しても画面表示は消去されない。画面の一時保存などVRAMの内容をDDへコピーし、処理後にDDか らVRAMへコピーする等使える。

次は直線を描くサンプル。

int AddIn_main(int isAppli, unsigned short OptionNum)
{
    unsigned int key;

    Bdisp_AllClr_DDVRAM();

  //四角を書く 
    Bdisp_DrawLineVRAM(0, 0, 127, 0);
    Bdisp_DrawLineVRAM(0, 63, 127, 63);
    Bdisp_DrawLineVRAM(0, 0, 0, 63);
    Bdisp_DrawLineVRAM(127, 0, 127, 63);

  //バッテンを書く 
    Bdisp_DrawLineVRAM(0,0,127,63);
    Bdisp_DrawLineVRAM(0,63,127,0);

    while(1){
        GetKey(&key);
    }

    return 1;
}

塗りつぶしや円の描画はSDKでサポートされていないので自分でライブラリを作るか拾ってくるかしなければならない。 海外のフォーラムで revolution.h というライブラリが紹介されていた。 このライブラリには塗りつぶしなどの関数があった様なので、興味がある人は検索してみればよい。

点を描画する際にはBdisp_SetPoint関数を用いる。


次に画像等のグラフィックデータを用いて任意の描画を行う。 グラフィックの描画はBdisp_WriteGraph関数を用いる。サンプルでは画面に★を描画する。

 int AddIn_main(int isAppli, unsigned short OptionNum)
{
    unsigned int key;
    DISPGRAPH picture;             // 構造体 DISPGRAPH の宣言
    GRAPHDATA picture_info;        // 構造体 GRAPHDATA の宣言
    unsigned char StarImage[] = {  // 画像データ
        0x00,0x00,
        0x01,0x00,
        0x01,0x00,
        0x03,0x80,
        0x03,0x80,
        0x7f,0xfc,
        0x3f,0xf8,
        0x0f,0xe0,
        0x07,0xc0,
        0x0f,0xe0,
        0x0e,0xe0,
        0x1c,0x70,
        0x10,0x10,
        0x00,0x00
    };
  /*
    ................ 00000000 00000000 0000
    .......@........ 00000001 00000000 0100
    .......@........ 00000001 00000000 0100
    ......@@@....... 00000011 10000000 0380
    ......@@@....... 00000011 10000000 0380
    .@@@@@@@@@@@@@.. 01111111 11111100 7ffc
    ..@@@@@@@@@@@... 00111111 11111000 3ff8
    ....@@@@@@@..... 00001111 11100000 0fe0
    .....@@@@@...... 00000111 11000000 07c0
    ....@@@@@@@..... 00001111 11100000 0fe0
    ....@@@.@@@..... 00001110 11100000 0ee0
    ...@@@...@@@.... 00011100 01110000 1c70
    ...@.......@.... 00010000 00010000 1010
    ................ 00000000 00000000 0000
  */
    Bdisp_AllClr_DDVRAM();  // グラフィック画面消去

    picture_info.width = 16;           // 画像データ
    picture_info.height = 14;
    picture_info.pBitmap = StarImage;
    picture.x = 10;
    picture.y = 10;
    picture.GraphData = picture_info;
    picture.WriteModify = IMB_WRITEMODIFY_NORMAL;
    picture.WriteKind = IMB_WRITEKIND_OR;
    Bdisp_WriteGraph_VRAM(&picture);
    Bdisp_PutDisp_DD();

    while(1){
        GetKey(&key);
    }

    return 1;
}
 構造体 GRAPHDATA , DISPGRAPH

   typedef struct tag_GRAPHDATA {
     int width;              
// 画像データの幅
     int height;             
// 画像データの高さ
     unsigned char *pBitmap; 
// 画像データのポインタ
   }

   typedef struct tag_DISPGRAPH {
     int x;                   
// 表示位置 x (0 ~ 127)
     int y;                   
// 表示位置 y (0 ~  63)
     GRAPHDATA GrapData;      
// 画像用構造体のポインタ
     WRITEMODIFY WriteModify; 
// 表示タイプ
                              
//   IMB_WRITEMODIFY_NORMAL  標準
                              
//   IMB_WRITEMODIFY_REVERSE 反転
                              
//   IMB_WRITEMODIFY_MESH    ハーフトーン
   }

ポップアップウインドウを使用してみる。

PopUpWin関数の引数は行数を表す 1~5 の整数で幅の指定はない。
ポップアップウインドウを閉じる命令は用意されていないので、ウインドウを開く前に SaveDisp関数を実行し、画面イメージを保存しておく、ポップアップウインドウの処理が終了したら RestoreDip関数で画面イメージを元へ戻す。

ポップアップウインドウといっても画面に枠を描画するだけであり、ウインドウ内に文字を表示する場合は、ウインドウの有無にかかわらず、文字位置を指定して表示しなければならない。

下記サンプルでは、サンプル画像を描画後に画面イメージを保存し、キーを押すくとによりポップアップウインドウを描画、画面イメージの復元を行っている。

 int AddIn_main(int isAppli, unsigned short OptionNum)
{
    unsigned int key;

    Bdisp_AllClr_DDVRAM();  // 画面消去

  //四角を書く
    Bdisp_DrawLineVRAM(0, 0, 127, 0);
    Bdisp_DrawLineVRAM(0, 63, 127, 63);
    Bdisp_DrawLineVRAM(0, 0, 0, 63);
    Bdisp_DrawLineVRAM(127, 0, 127, 63);

  //バッテンを書く
    Bdisp_DrawLineVRAM(0,0,127,63);
    Bdisp_DrawLineVRAM(0,63,127,0);

    SaveDisp(SAVEDISP_PAGE1);  // 画面イメージを保存

    while(1){
        GetKey(&key);
        switch(key) {
            case KEY_CHAR_1:
                PopUpWin(3);  // ポップアップウインドウを表示
                break;
            case KEY_CHAR_2:
                RestoreDisp(SAVEDISP_PAGE1);  // 保存している画面イメージを復元
                break;
        }
    }

    return 1;
}
 void PopUpWin(int n)  // n は行数(1~5)

 
画面イメージの保存
 void SaveDisp(unsigned char num) 
// num には定義済みの定数を用いる
                                  
// SAVEDISP_PAGE1
                                   // SAVEDISP_PAGE2
                                   // SAVEDISP_PAGE3

 画面イメージの復元
 void RestoreDisp(unsigned char num)  // num には定義済みの定数を用いる
                                      // SAVEDISP_PAGE1
                                      // SAVEDISP_PAGE2
                                      // SAVEDISP_PAGE3

応用としてグラフィック表示でカタカナを表示する。 まずはサンプルソース。

 // カナフォント 6x8
static const unsigned char KanaFont[][8] = {
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}// A0 (SPC)
   ,{0x00,0x00,0xE0,0xA0,0xE0,0x00,0x00,0x00}// A1 。
   ,{0x38,0x20,0x20,0x20,0x00,0x00,0x00,0x00}// A2 「
   ,{0x00,0x00,0x20,0x20,0x20,0xE0,0x00,0x00}// A3 」
   ,{0x00,0x00,0x00,0x80,0x40,0x20,0x00,0x00}// A4 、
   ,{0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00}// A5 ・
   ,{0x00,0xF8,0x08,0xF8,0x08,0x10,0x20,0x00}// A6 ヲ
   ,{0x00,0x00,0xF8,0x08,0x30,0x20,0x40,0x00}// A7 ァ
   ,{0x00,0x00,0x10,0x20,0x60,0xA0,0x20,0x00}// A8 ィ
   ,{0x00,0x20,0xF8,0x88,0x08,0x30,0x00,0x00}// A9 ゥ
   ,{0x00,0x00,0x00,0xF8,0x20,0x20,0xF8,0x00}// AA ェ
   ,{0x00,0x00,0x10,0xF8,0x30,0x50,0x90,0x00}// AB ォ
   ,{0x00,0x00,0x40,0xF8,0x48,0x50,0x40,0x00}// AC ャ
   ,{0x00,0x00,0x00,0xF0,0x10,0xF8,0x00,0x00}// AD ュ
   ,{0x00,0x00,0xF0,0x10,0xF0,0x10,0xF0,0x00}// AE ュ
   ,{0x00,0x00,0xA8,0xA8,0x08,0x30,0x00,0x00}// AF ッ
   ,{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00}// B0 ー
   ,{0xF8,0x08,0x28,0x30,0x20,0x20,0x40,0x00}// B1 ア
   ,{0x08,0x10,0x20,0x60,0xA0,0x20,0x20,0x00}// B2 イ
   ,{0x20,0xF8,0x88,0x08,0x08,0x10,0x20,0x00}// B3 ウ
   ,{0x00,0xF8,0x20,0x20,0x20,0x20,0xF8,0x00}// B4 エ
   ,{0x10,0xF8,0x10,0x30,0x50,0x90,0x10,0x00}// B5 オ
   ,{0x40,0xF8,0x48,0x48,0x48,0x48,0x90,0x00}// B6 カ
   ,{0x20,0xF8,0x20,0xF8,0x20,0x20,0x20,0x00}// B7 キ
   ,{0x78,0x48,0x88,0x08,0x08,0x10,0x60,0x00}// B8 ク
   ,{0x40,0x78,0x90,0x10,0x10,0x10,0x20,0x00}// B9 ケ
   ,{0xF8,0x08,0x08,0x08,0x08,0x08,0xF8,0x00}// BA コ
   ,{0x50,0xF8,0x50,0x50,0x10,0x20,0x40,0x00}// BB サ
   ,{0x00,0xC0,0x08,0xC8,0x10,0xE0,0x00,0x00}// BC シ
   ,{0x00,0xF8,0x08,0x10,0x20,0x50,0x88,0x00}// BD ス
   ,{0x40,0xF8,0x48,0x50,0x40,0x40,0x38,0x00}// BE セ
   ,{0x00,0x88,0x88,0x48,0x08,0x10,0x60,0x00}// BF ソ
   ,{0x78,0x48,0xA8,0x18,0x10,0x60,0x00,0x00}// C0 タ
   ,{0x10,0xE0,0x20,0xF8,0x20,0x20,0x40,0x00}// C1 チ
   ,{0xA8,0xA8,0xA8,0x08,0x10,0x20,0x00,0x00}// C2 ツ
   ,{0x70,0x00,0xF8,0x20,0x20,0x20,0x40,0x00}// C3 テ
   ,{0x40,0x40,0x40,0x60,0x50,0x40,0x40,0x00}// C4 ト
   ,{0x20,0x20,0xF8,0x20,0x20,0x40,0x80,0x00}// C5 ナ
   ,{0x00,0x70,0x00,0x00,0x00,0x00,0xF8,0x00}// C6 ニ
   ,{0x00,0xF8,0x08,0x50,0x20,0x50,0x80,0x00}// C7 ヌ
   ,{0x20,0xF8,0x10,0x20,0x70,0xA8,0x20,0x00}// C8 ネ
   ,{0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00}// C9 ノ
   ,{0x00,0x20,0x10,0x88,0x88,0x88,0x88,0x00}// CA ハ
   ,{0x80,0x80,0xF8,0x80,0x80,0x80,0x78,0x00}// CB ヒ
   ,{0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x00}// CC フ
   ,{0x00,0x40,0xA0,0x10,0x08,0x08,0x00,0x00}// CD ヘ
   ,{0x20,0xF8,0x20,0x20,0xA8,0xA8,0x20,0x00}// CE ホ
   ,{0x00,0xF8,0x08,0x08,0x50,0x20,0x10,0x00}// CF マ
   ,{0x70,0x00,0x70,0x00,0x70,0x08,0x00,0x00}// D0 ミ
   ,{0x00,0x20,0x40,0x80,0x88,0xF8,0x08,0x00}// D1 ム
   ,{0x00,0x08,0x08,0x50,0x20,0x50,0x80,0x00}// D2 メ
   ,{0x00,0xF8,0x40,0xF8,0x40,0x40,0x38,0x00}// D3 モ
   ,{0x40,0x40,0xF8,0x48,0x50,0x40,0x40,0x00}// D4 ヤ
   ,{0x00,0x70,0x10,0x10,0x10,0x10,0xF8,0x00}// D5 ユ
   ,{0x00,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x00}// D6 ヨ
   ,{0x70,0x00,0xF8,0x08,0x08,0x10,0x20,0x00}// D7 ラ
   ,{0x90,0x90,0x90,0x90,0x10,0x20,0x40,0x00}// D8 リ
   ,{0x00,0x20,0x20,0xA0,0xA8,0xA8,0xB0,0x00}// D9 ル
   ,{0x00,0x80,0x80,0x88,0x90,0xA0,0xC0,0x00}// DA レ
   ,{0x00,0xF8,0x88,0x88,0x88,0x88,0xF8,0x00}// DB ロ
   ,{0x00,0xF8,0x88,0x88,0x08,0x10,0x20,0x00}// DC ワ
   ,{0x00,0xC0,0x00,0x08,0x08,0x10,0xE0,0x00}// DD ン
   ,{0x20,0x90,0x40,0x00,0x00,0x00,0x00,0x00}// DE ゙
   ,{0xE0,0xA0,0xE0,0x00,0x00,0x00,0x00,0x00}// DF ゚
};

void KPrintC(char x, char y, unsigned char c) { //カナ一文字表示
    DISPGRAPH kfont;
    GRAPHDATA kfont_info;

    x = x * 6 - 6;
    y = y * 8 - 8;
    c = c - 0xA0;

    kfont_info.width = 6;
    kfont_info.height = 8;
    kfont_info.pBitmap = KanaFont[c];
    kfont.x = x;
    kfont.y = y;
    kfont.GraphData = kfont_info;
    kfont.WriteModify = IMB_WRITEMODIFY_NORMAL;
    kfont.WriteKind = IMB_WRITEKIND_OR;
    Bdisp_WriteGraph_VRAM(&kfont);
    Bdisp_PutDisp_DD();
}

void KPrint(char x, char y, char *c) {
  while(*c) {
      KPrintC(x, y, *c++);
      x++;
  }
}

int AddIn_main(int isAppli, unsigned short OptionNum){
    unsigned int key;
    char text[] = "アイウエオ";

    KPrint(5,3,text);

    while(1){
        GetKey(&key);
    }

    return 1;
}

上記サンプルの応用としてKPrintC と KPrint に手を加えて、カタカナとアルファベットが混在している文字列を表示出来るようにする。 ソースは関数部分のみ。

 void KPrintC(char x, char y, unsigned char c) {
    if (c < 0xA0) {
        locate(x, y);
        Print(&c);
    } else {
        DISPGRAPH kfont;
        GRAPHDATA kfont_info;

        x = x * 6 - 6;
        y = y * 8 - 8;
        c = c - 0xA0;

        kfont_info.width = 6;
        kfont_info.height = 8;
        kfont_info.pBitmap = KanaFont[c];
        kfont.x = x;
        kfont.y = y;
        kfont.GraphData = kfont_info;
        kfont.WriteModify = IMB_WRITEMODIFY_NORMAL;
        kfont.WriteKind = IMB_WRITEKIND_OR;
        Bdisp_WriteGraph_VRAM(&kfont);
        Bdisp_PutDisp_DD();
    }
}

void KPrint(char x, char y, char *c) {
    while(*c) {
        KPrintC(x, y, *c++);
        x++;
    }
}