OSを自作する(11) [矩形の描画]

間隔があいてしまいました。
まだまだ4日目です。

前回、いろいろ疑問が出てきたのですが、
まだ疑問を解消するレベルまで僕が達していないと思うので
とりあえずもう少し進めることにしました。

さて前回までは描画を行うために、いちいちVRAMとして使われているメモリにアクセスしていました。しかしこれではただ点を打つだけでも、大変です。

そこで今回はVRAMへのアクセス処理を隠蔽した、DrawRectという関数を作成しました。(本文中でやっていることとほぼ同じです。)


int DrawRect(int x, int y, int width, int height, int colorNum, int isFill) {
    int     result      = TRUE;
    char*   display     = (char*)0;
    char*   startAddr   = (char*)(VRAM_ADDR_START + x + y * SCREEN_WIDTH);
    int i = 0;
    int j = 0;

    // 領域チェック
    if (x < 0 || y < 0 ||
        x > SCREEN_WIDTH || y > SCREEN_HEIGHT ||
        width < 0 || height < 0) {
        result = FALSE;
    }
    else if (x + width > SCREEN_WIDTH ||
             y + height > SCREEN_HEIGHT) {
        result = FALSE;
    }

    if (result != FALSE) {
        // 描画処理
        // 一行ずつ描画していく
        for (i = 0; i < height; i++) {
            display = startAddr + i * SCREEN_WIDTH;

            for (j = 0; j < width; j++) {
                // 枠
                if (j == 0 || j == width - 1 ||
                    i == 0 || i == height - 1) {
                    display[j] = colorNum;
                }
                // 塗りつぶし
                else if (isFill != FALSE) {
                    display[j] = colorNum;
                }
            }
        }
    }

    return result;
}

この関数を利用していくつか四角を描画してみました。

DrawRect

さらにこの関数を使用して以下のようにWindowsのような画面?を書いて見ました。本文とは少し違っているのですが、なるほど「ハリボテOS」はナイスネーミングですね(笑)

Windows見たいな見た目になってきた?

今回進んだ部分は以上なのですが、若干つまずいたことがあるので残しておきます。それは現在使用しているコンパイラ(cc1.exe)の検出してくれるエラーが想定よりも少ないと言うことです。例えば、定義されていない関数を呼び出そうとしてもエラーが出ず、コンパイルが通ってしまいます。そして実行時に予期しないメモリ領域にアクセスしてしまい、固まってしまうと言うことが起こりました。つまり関数のタイプミスにかなり気づきにくいと言うことです。僕は1時間ほどハマってしまいました。

少しコンパイラのオプションについて調べてみようと思います。

次回はついに5日目です。
文字の描画などを解説しているようです。張り切って進みます!

コメント / トラックバック6,327件

コメントをどうぞ