戻る
ペイントエンジンとは何か (2025/09/28)
FireAlpacaのような
ペイントツールで使用している、キャンバス、レイヤー、ブラシ処理などを行う一連のソースコードの事。
以前は単純に
「ライブラリ」と呼んでいたけど、ライブラリだと
もっと狭い範囲の処理を行う事が多いし、最近は「ゲームエンジン」「ブラウザエンジン」「物理エンジン」など使われる事が多いので、
格好付けて「ペイントエンジン」と呼ばせてもらっている。
ペイントエンジンには何が含まれるのか?
単純さ、ソースコードの短さから並べていくと、
・本当に基本的な処理(矩形や点の定義、文字列型の定義、ファイル処理など)
・画像を扱うクラス(1bpp画像、32bpp画像、なるべくメモリを使わない画像など)
・画像処理をする関数(グラデーション描画、テクスチャ描画、矩形転送など)
・ブラシストロークを描画する関数(離れた点列を受け取り補完する)
・画像ファイルを読み書きする関数(PSD、MDP、MDZなど)
・レイヤーを定義したクラス(画像バッファ、レイヤー名、不透明度など)
・キャンバスを定義したクラス(複数のレイヤーを管理する、キャンバスの回転拡大縮小などを行う)
・キャンバスを表示するクラス(キャンバス内のレイヤーを、任意の倍率や回転角で表示する)
などを行う、一連のソースコードになる。
「ふつうの初心者向けペイントソフト」として認識されるだけでも
膨大な実装が必要ですが、機能を絞って作れば
夏休みを使って(1~2ヶ月)開発すればいいところまで行けるでしょう。
マウスやタッチから入力した座標から線を描画したり、筆圧を取得したり、取り消し操作を行えるようにしたり、カラーピッカーから色を選んだり、画像を保存したり、読み込んだり、PNGやJPEGで書き出したり、レイヤーを実装してみたり、ブレンドモードを追加したり、キャンバス解像度を変更したり。
プログラミング中級者になるための課題として丁度良いと思います。プログラミングも覚えて、自分が使う道具も作れる。
みんなペイントエンジン(ペイントツール)を作ろう!
ペイントエンジンのポータビリティ
今どきのアプリケーションは
「どのOSでも動く」事が要求される。特にクリエイティブ系ツールは
必須と言っても良い。
例えば、全てのコードをOSネイティブ言語 (SwiftやJavaやKotlin) で書いてしまったら、iOSでしか動かない、Androidでしか動かないアプリケーションになってしまう。
ペイントエンジンを各プラットフォームで独自実装なんて不可能なので、やはりそこはポータブルに使い回せる言語で実装するしかない。そうすると
C++を選ぶしかない。
ペイントエンジンはC++で書くとして、UI側、アプリケーション側の実装をどんな言語やUIライブラリを使うかは悩ましい。
FireAlpacaでは Qtを使っている。Qtに振り回される事は多いけど、おかげで Windows でも macOS でも似たような感じのアプリケーションをリリースできる。いちいちOSごとに開発する必要はない。
QtはiOS対応も謳っている。ただ、
iOSでの動作は本当に酷い。ただビルドするだけでは PC版のようには全く動かない、ユーザーは絶対に許してくれないし、これをPC版のようなクオリティまで高めるのは無理だと思ったので諦めた。そういう意味で、
Qtのようなフレームワークに頼るのは限界がある。
CLIP STUDIO PAINT や ibisPaint は、
UIも独自に実装しているようだ。これなら iOS でも Android でも問題なく動作させられる。大変な苦労があるとは思うし、
OS標準のUIではなくなるデメリットもあるが、その価値はある。
ペイントエンジン開発の面白さ
自分が絵を描く人間なら
「理想のツールを作る」という夢を追い求める事ができる。自分のクリエイティビティを、自作のツールで発揮できる……なんて素晴らしい事だろう!
「巨大なデータを扱いつつ、リアルタイム性の高いコードを書く」必要があるというのも面白い。データ構造に気をつけて、扱うデータサイズが大きくなっても遅くならないようなコードを書いたり、コードの最適化を行ったり、マルチスレッド処理やGPU処理が必要になってくるのも面白い。
「ポータビリティ」について考える必要があるのも面白い。ポータブルなコードとは何なのか、環境ごとにどう切り分ければ良いのか、それとも全てを解決するポータブルな開発環境にベットすべきなのか。今から開発すれば、
20年以上継ぎ足し続けて秘伝のソースコードとは違う結論が出るかもしれない。