Yabu.log

ITなどの雑記

30日OS自作本11日目

11日目はついにWindowを作ります。

Windowのハローワールド的なもの

ウインドウ

ウインドウの作り方です。簡単にコメントで補足してみました。

struct SHEET *sht_win;
unsigned char  *buf_win;

/*リソース確保*/
sht_win   = sheet_alloc(shtctl); //シート
buf_win   = (unsigned char *) memman_alloc_4k(memman, 160 * 68); //メモリ確保
sheet_setbuf(sht_win, buf_win, 160, 68, -1); /* 透明色なし */

/*グラフィカルな部分を作るヘルパー関数*/
make_window8(buf_win, 160, 68, "window");

/*Windowに各文字の設定*/
putfonts8_asc(buf_win, 160, 24, 28, COL8_000000, "Welcome to");
putfonts8_asc(buf_win, 160, 24, 44, COL8_000000, "  Haribote-OS!");

/*位置と高さを設定する*/
sheet_slide(sht_win, 80, 72);//位置
sheet_updown(sht_win,   2);//高さ

描画(refresh)の改善

ウインドウの描画時に意図しないチラツキが発生するので改善します。

  • 全シートの書き換え
  • 改善1:指定したシート以上を書き換え
  • 改善2:指定したシート以上で重ならない部分のみを書き換え

GUIの描画について考えるときは書き換えを行なった高さのシート以外の扱いを注意する必要があります。書き換え対象より下の層は描画する必要はありません。 描画してしまうと「全シート書き換え」の時のように一番下のレイヤである背景がvram上に書かれてしまいます。 画面refresh時にすぐ上のウインドウに上書きされますが、一瞬だけ描画される時間ができるので、チラツキとして画面に現れてしまいます。

改善1で書き換え対象(今回はウインドウ)より下のレイヤは描画しなくなりましたが、上のレイヤ(今回はマウス)に重なったレイヤは描画する必要はありません(チラツキの原因)

改善2のためにmapという仕組みを導入しています。

Mapとは

Mapを使ってvramの各ピクセルはどのシートが写っているかを管理します。 vramと同等のサイズ(unsigned int(1B)で320 * 200)の配列で管理します

struct SHTCTL {
    unsigned char *vram, *map;
    int xsize, ysize, top;
    struct SHEET *sheets[MAX_SHEETS];
    struct SHEET sheets0[MAX_SHEETS];
};

mapを導入することで

  • チラツキの解消
  • 描画範囲の更なる限定

が実現できましたが、メモリーがMAPのサイズ分((unsigned int(1B)で320 * 200)=64000B=64KB)減っています。 画面に表示されているメモリ残量が64KB減っています。

free: 29216KB → 29152KB

感想

ウインドウが出てきたことによりOSっぽくなってきました。 しばらくGUIはお別れになるようです。day12ではタイマーを扱います。

GUIオブジェクト指向

  • Javaの入門書 -> アニマルクラスの鳴き声の例が意味不明
  • 大学の授業 -> レベルが高かったらしく虚数のデータ型を淡々と作る内容で意味不明

という訳で、最初にオブジェクト指向的なものに出会ったのが自宅で作ってたiOSGUI(ボタン、ラベル)でした。 GUIオブジェクト指向っぽくあって欲しい、という個人的な思いがあるので、この辺はOOPができる言語(Rust,C++)で進めている人たちは データモデリングが楽しいだろうなと思います。

30日でできる! OS自作入門

30日でできる! OS自作入門