抱き枕を意識して、と思ったけどだらしないだけになる。

ブラシ

ブラシとかどう実装しようと思って久々にmdiappを起動した。
(この図はdiaで描いた)
意外と盲点というか、単にえんぴつツールを実装するだけでも、

  • 両端の丸を描く
  • 間を台形でつなぐ

という処理が必要で、通常の人間がいきなりペイントソフトを作るとマウスイベントの度に点だけ打ってみて何か間違ってるなと感じることが多いように思う(少なくとも僕は以前やった)。
要するに、描画イベントの生成と実際の描画を分離して設計し、描画イベントを生成する段階ではタイルで分割してbitmapを保持しているとかを意識する必要の無いデザインにする必要が有る。

編集画面の描画フロー

当初、描画は全部cairoで良いかなと思っていたけど、予想以上に(atomでは)cairoが重かったので、1bitのbitmap下書きレイヤはちゃんと実装することに。。
glitzを使えば十分な速度が出るだろうという目論見は外れで、結局のところOpenGLを使った描画も手で実装しないと不味そうな雰囲気*1。頂点編集の段階までのワイヤフレームモードくらいは手で書いて、マテリアル編集以降でcairoを使う方向。
希望としてはcairoで描いたスクロールバリバリのUIがatom位のCPUでも30fpsで動いて欲しいところだが、現段階では適当な範囲に区切って描画して自前でbitmapをキャッシュする必要が有りそう。Gtk等はWidgetの描画をcairoベースにしているし、Geckoもcairoを導入しているが、ひとつのsurfaceで(window systemを含めた)GUI全体を描画するにはcairoのAPIでは表現力が足りないのかもしれない。
こう書くとcairoが遅いというイメージを植えつけそうな気もするが、通常の使用範囲ではcairoは十分に速い。

*1:そもそもglitzはメンテナンスされていないように見える。X(e)glとglitzが普及してくれるといろいろと手間が省けて便利なんだけども。。代わりにAIGLXが普及してしまったので、ちょっといろいろと問題が難しくなっている。