30日OS自作本11日目
11日目はついに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とオブジェクト指向
という訳で、最初にオブジェクト指向的なものに出会ったのが自宅で作ってたiOSのGUI(ボタン、ラベル)でした。 GUIはオブジェクト指向っぽくあって欲しい、という個人的な思いがあるので、この辺はOOPができる言語(Rust,C++)で進めている人たちは データモデリングが楽しいだろうなと思います。
- 作者: 川合秀実
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2006/03/01
- メディア: 単行本
- 購入: 36人 クリック: 735回
- この商品を含むブログ (299件) を見る