アプリが作るシート。これを二段構えにしたい。
例えばアプリが100x100のウィンドゥを作るべくAPIを発注したとする。はりぼてのノーマル状態だと100x100のシートが用意され、ウィンドゥが描画される。
しかしこれはよくないのではないかと考え始めた。タイトルバーやフットバー等、アプリが直接手を出せない(つまりOSが管理する)範囲までアプリ側に任せてしまうのはどうかというのがそもそも。
しかし、そもそもシートに設置されているバッファはアプリの権限で用意されるしそうでなくてはならない。どうしたらよいだろうか・・・
いろいろと考えてみたが、とりあえずはこの方法しか思い浮かばなかった。つまりこういう状態にするわけ。
こうすることそのもののやり方はまあ、ある程度想像はできるんだけど、こうなると一枚のウィンドゥを書くたび、裏のシートを書いて次に表を・・・と、今までの2倍時間がかかるはず。
それだけじゃない。バッファが倍(もしくは倍より少し多く)必要になり、メモリも喰う。いいことない・・・
そこで、バッファからvramに転送する部分を改良して、タイトルバーを越えてクライアント領域になったらパチンと転送元を切り替えてしまう。そんなのをのを妄想してみた。
・・・しかし、そうなるとクライアント領域と同じ大きさの、まったく使われない領域がバッファ内にできることになる(裏のシートのクライアント領域の位置)
これまたすごーく無駄でもったいないような気がしてきた・・・
こんな方法はダメだろうか?
あくまでも妄想のレベルなのだが・・・
- システムとしてシートを管理しているんだけど、実はシートはクライアント領域しかない。
- システムがなんにもしないと、クライアント領域のものだけが描画されるような状態。(当然枠もタイトルバーもなにもないような状態)
- システムがシートを描画する時に、自動で枠等をそのつど「描画する」
- マウスがタイトルバー等をクリックした場合はどうするか?
- システムが自動でそれを演算するだけ
・・・これはでも、そうとう大掛かりな変更になるなぁ。でも、とにかく一旦、この路線でやってみるか・・・
挫折・・・・orz
くっそぉ・・・どーもうまくイカン・・・。マウスが重なった時の書き換えがより複雑になってしまうような・・・。
難しく考え杉?
・・・ここに来てふと思った・・・・
たとえばだけど、アプリからのウィンドゥへの書き込み。これを全て、APIを通してしか出来ないなんてしておけばOK? もしかして???
そうすると・・・・openwin関数を改良。バッファはシステム側で用意してアドレスを返すとかしておけばいいのかな??
えーっと・・・現在のopenwinは・・・
- EDX:5
- EBX:ウィンドゥのバッファ
- ESI:ウィンドゥのX方向の大きさ
- EDI:ウィンドゥのY方向の大きさ
- EAX:透明色
- ECX:ウィンドゥの名前
- 戻り値:ウインドゥの番号
これを、
- EDX:5
- ESI:ウィンドゥのX方向の大きさ
- EDI:ウィンドゥのY方向の大きさ
- EAX:透明色
- ECX:ウィンドゥの名前
- EBX:ウィンドゥの属性
- 戻り値:ウインドゥの番号 こうしちゃう。バッファはシステム側で用意する。(もちろん権限はシステムなので勝手に書き換えることはできない)
そうなると・・・
こういうふうに改造すると、今度は当たり前だけどウィンドゥに物を書くことができない。なのでそういうことをするAPIが必要になるよね。
ええと・・・改造が必要なAPIは・・・
api_putstrwin | 0x06 | 文字列をウィンドウに描画 | できた! |
api_boxfilwin | 0x07 | 矩形をウィンドウに描画 | できた! |
api_point | 0x0B | 点をウィンドウに描画 | できた! |
api_refreshwin | 0x0C | ウィンドウ再描画 | できた! |
api_linewin | 0x0D | 線をウィンドウに描画 | できた! |
api_closewin | 0x0E | ウィンドウを閉じる | できた! |
うーん。あと、ブロック転送するようなAPIほしいよね?
- EBX:転送元のポインタ(もしくは配列)
- EAX:転送するシート
- ESI:転送するY点
- EDI:転送するX点
- ECX:転送する幅
- EBP:転送する高さ
- 戻り値:はみ出たかはみ出ないか
こんなの、どじゃろ???
よーし。在来のAPIの改良はこれでいいかな・・・・
ブロック転送APIを作るか。
api_blocksend
- EDX:120
- EBX:転送元のポインタ(もしくは配列)
- EAX:転送するシート
- ESI:転送するY点
- EDI:転送するX点
- ECX:転送する幅
- EBP:転送する高さ
- 戻り値:はみ出たかはみ出ないか
でけた〜!!