これはやまかわが、しげっち氏のMixBrushツールとG-Penツールをthe GIMP 2.4.xに移植したうえで、MixBrushツールに独自の改造を行ったものです。
試用される方へ:当方は、これらのツールにどれだけの需要があるのかという点に非常に関心を持っています。試用後、将来のGIMPにこれらのツール(または同種のツール)が追加されることを希望する・しないのいずれかをメールなどでお教えください。また、「G-PenやMixBrushは求めているものとは違う。かわりにこういうペイント系ツールがあればよい」という意見や、実際にG-PenやMixBrushで描かれたイラスト(のURL)があれば併記していただくとよいかと思います。メールの送り先はページの末尾をご覧ください。
イラストを描くという用途においては機能的に不十分とされることもあるthe GIMPを拡張して、よりハッピーになろうというような趣旨のプロジェクトです。プロジェクト管理者はしげっち氏です。当方はプロジェクトメンバーですが、単に場所を間借りしているだけのような気がしないでもありません;-)
プロジェクトのページで配布しているパッケージのうち、gimp-painter-(マイナスがお尻に付く方)のreadmeファイルを今読んでいただいているわけですが、マイナスが付いているのはコードの質がオリジナルより劣るというところに由来しています。
GIMPのソースを展開したら、あとはパッチを適用して普通にビルドするだけです。すでに以前のパッチが適用済みの場合は、ひとつ前の版からのパッチもありますのでそちらを使ってください(版によってはないかもしれませんが)。
Note:x86系CPU用にビルドされる方は、コンパイルオプションとして浮動小数点数演算にSSEの使用を強制するスイッチを追加することを推奨します。例えば、gccでは"-msse2 -mfpmath=sse"(SSE2を使用する場合)といった内容になります。
先に公式ビルドまたは野良ビルドのGIMP 2.4.3をインストールし、インストール先のgimp-2.4.exeをgimp-painter--YYYYMMDD_win32_bin.zip(binの後に対応CPUに応じた文字列が追加されることもあります)に入っているものに差し替えてください。また、起動時にlibfreetype-6.dllが無いと言われてしまう場合には、freetype6.dllを探して同じ場所にlibfreetype-6.dllの名前でコピーしてください。
ちなみに、公式ビルドまたは野良ビルドの適当なバージョンがない場合には、baseアーカイブ(gimp-painter--YYYYMMDD_win32_base.zip)をダウンロードし、適当なフォルダに解凍してください。このbaseアーカイブにはGTK+のEnginesとしてNodokaとAuroraが同梱されており、デフォルトのテーマではNodokaが使われています。GTK+アプリケーション全般のテーマ設定がMS-Windows(またはwimp engineを使用するその他のテーマ)になっているとボタンやコンボボックスなどの描画がおかしくなりますので、その場合はGIMPのテーマをMS-Windowsに変更するか、またはGTK+アプリケーション全般のテーマを他のものに変更してください。
通常は描点毎に行われるドキュメントウインドウ上の表示更新を抑制することで、体感速度を改善します。実際の更新頻度はブラシサイズとストロークの速度によって動的に変化します。
ペイント系の全ツールで有効ですが、望ましい効果が得られるかどうかはツールの種類やブラシサイズによって異なります。
ブラシサイズを筆圧でコントロールする際の、(最大筆圧時のサイズを基準にした)最小倍率です。
例えば、1.0を指定すると圧力感度の筆圧をオフにするのと同じことになりますし、0を指定すれば従来どおりの変化の仕方をします。0.5を指定した場合には、最も軽い筆圧で最大筆圧時の50%サイズになります。
アルファ付きのレイヤーで、アルファ値を含めた混色を行います。また、混色結果のアルファ値が描画対象ピクセルのアルファ値より小さい場合、実際に描画結果のアルファ値が描画前より小さくなることを許容します(図右側のようなイメージ)。
アルファ付きレイヤーと、それ以外のdrawableとの描画結果の違いを最小限に抑えるには、Paint with pigmentにチェックを入れ、Canvas colorのdensityを1.0に固定してください。
Note:Alpha channel mixingの使用には次の制限があります。
Note:Alpha channel mixingが有効のとき、体感速度の改善のため画面の再描画を行う頻度を減らします。減らす度合いはカーソルの移動速度とブラシサイズを元にして、動的に決定されます。
Main colorは筆の穂に含まれる塗料のコントロールになります。Densityは塗料の量を指定するもので、0では全く着色する能力がなくなり、1.0にすると下地の色が混ざらなくなります。
※Paint with pigmentがオフの場合には、Canvas color densityが0でない限り、Main color densityが1.0でも下地の色が混ざります。
塗料の中に前回打った描点のカラーが混じってくる割合を指定します。値が小さいほどより多く混じるようになります。
混色をしたい場合には、Main color rateを低くし、Canvas color rateを高くします。さらに不透明度を筆圧で調整するようにするとよりきれいに処理できるでしょう。
Painterの「色の伸び」に相当するパラメータです(単位はピクセル)。ストロークの長さに比例してMain colorのDensityが下がっていき、指定値に達すると0になります。
Dryoutの値が0の場合は例外として、全く減衰しません。
Main colorとCanvas colorのブレンドには、両者の不透明度(×濃度)の比率を用いる方法と、レイヤーの重ね合わせと同じ方法の2種類があります。Paint with pigmentがオンになっている場合には、後者の方法でブレンドされます。
11月4日以前の版に近い処理をさせたい場合には、Canvas colorのDensityを1.0に固定した上で、Paint with pigmentをオンにしてください。このとき、Main color densityはCanvas color rateに、Main color rateはOriginal color rateに対応します。
下地のカラーが混じる分量を指定します。あえて例えるなら、水や溶剤の分量と言えるかもしれません。
Main color、Canvas color双方のDensityが0の場合には、ペイントしても何も起こりません。ただし、Alpha channel mixing有効時にアルファ付きレイヤーへペイントすると、消しゴムのような振る舞いをします。
下地のカラーとして、ストロークを描画する前のカラーを加味する割合を指定します。値が小さいほどより多く加味されるようになります。高い値では色の伸びが良くなり、若干低い値にすると絵の具の粘りやかすれ感が強調されます。
値がある程度低くなってくると、描点の形が見えて不自然になる傾向がありますので、1.0を基準にして値を少しずつ下げていくのがベターです。
筆圧のパラメータは、入力と出力それぞれの最小・最大値を指定する形式になっています。
例えば、入力が0.25~0.75、出力が0.3~0.9となっているとすると、筆圧が0から25%までは30%という出力になり、以降筆圧75%までは出力も上がっていきます。75%の筆圧で最大出力の90%に達し、それを超える筆圧では90%を維持します。
この出力値は、筆圧の適用対象となるパラメータに掛け合わされます。対象パラメータの設定値を1.0に固定しておくと、出力の上限・下限がそのまま対象パラメータの上限・下限になるのでコントロールしやすくなるでしょう。
ちなみに、筆圧によるコントロールを無効にしたい場合は、出力側を両方とも1.0にしておきます。また、出力の1が2より大きな値を取る場合、筆圧が反転されます(筆圧が軽いほど出力が上がる)。入力側については、1と2のどちらが大きい値をとっても(内部処理で入れ替えるので)動作に違いはありません。
ストロークを描画する前のカラーを得る際に、ストロークを開始する前のデータからカラーを取得してしまうと、自分自身のストロークをにじませることができません。
そのため、ストロークの開始後、実際に描点を打ち込むのを一時保留することで適切なカラーを取得できるようにしています。
Delayパラメータは、処理を保留する描点の数を指示するものです。大きな値を指定すると、スタイラスの動きに対して実際の描画が追いかけてくるようになるので多少の違和感があるかもしれません。逆に小さな値を指定すると違和感が軽減されますが、直前の描点のカラーを拾ってしまうため、Canvas color(rate)の効果が得られなくなります。
ストロークの終端Delay個分の描点を処理するように指示します。Delayを1以上にしている場合の描画が気になる方はチェックを外すと気分的には改善されます。
カラーを拾う範囲(直径)の上限をピクセル数で指定します。
GIMPに元々あるAPI関数で平均を取っているのですが、結構重たいのでこのパラメータで制限をかけています。
描画対象レイヤーのカラーではなく、全てのレイヤーを統合した結果のカラーが混じってきます。ブラシサイズがある程度大きくなってくると重くなるので注意。
本来なら、Painterの「下の色を拾う」にならって、描画対象のレイヤーより上位のレイヤーを除いた統合カラーを使用したいところですが、知識不足と手抜きのため現在の仕様になっています。何もないよりはマシだろうということで。あと、制限事項として、レイヤーのキャンバス外にあるピクセルカラーが拾えず、白か黒が混じってくる、というのがあります。
アルファ付きレイヤーにペイントするとき、Canvas colorに白または背景色が混じります。normalは単に(半)透明色として処理します。
GimpDisplaySellでポインターの加速度を計算し、それをGimpCoords構造体から取得できるようにする修正が2.5系のソースに入ったのを受けて、GimpPaintCoreの再描画頻度調整処理とG-Penツールで加速度情報を使用するようにしました。gimp-painter-パッチは2.4系ベースですので、加速度を計算する個所を2.5系のソースから移植しています。
1月3日版で追加した処理をGimpPaintCoreクラスに移しました。また、頻度調整のための計算方法を変更しました。
Alpha channel mixing有効時に再描画の頻度を減らす処理を追加しました。
Windowsバイナリを2.4.3に更新しました。
Alpha channel mixing有効時の処理速度を改善しました。従来は描点が収まる領域のバッファ上で描点を適用する処理を行ってから、GIMPのAPIを呼び出してdrawableに反映させる流れでしたが、12月22日版では直接drawableに対して描点を適用しています。
このため、現在のところ(1)選択範囲が無視される(2)RGBレイヤーへの描画時、選択されていないチャンネルにも描画されてしまう、という制限事項があります(処理速度への影響が軽微であれば、今後の版で修正します)。
12月7日版で描き始めにいきなり落ちる問題がありましたが、これが改善されたかもしれません。されていないかもしれません。
ツールのデフォルト値を変更し、とりあえず混色ブラシらしい動作をするようにしました。
Alpha channel mixingオン・Paint with pigmentオンのとき、Main colorとCanvas colorのdensityがともに下がっていくにつれて透明にする力が強くなるはずですが、実際には0になって急に効いてくるようになっていたので修正しました。
Alpha channel mixing関連の修正です。グレイスケールのdrawableで機能しない件、Main colorとCanvas colorのdensityが共に0のときアルファ付きレイヤーにペイントすると白い四角が描画される件、アルファ付きレイヤーへのペイント時、意図せず描き始めのアルファ値が下がってしまう件が改善されています。
混色処理の調整とAlpha channel mixing有効時の処理速度アップ(程度としては若干、ですが)を行いました。
11月7日版のところで書いていた、「レイヤーのアルファを描点のアルファ値に置き換えること」の件を試しに組み込んでみました。
実際にはそれだけでは済まずに色々と調整やらゴマカシもあるのですが……。
Windowsバイナリを2.4.2に更新しました。コンパイラの最適化オプションをPentium4向け(従来はPentium3向け))に変更しましたので、環境によっては動作しないかもしれません。
描点カラーを8ビット整数値に変換する際生じる誤差を次回の処理でCanvas colorに組み込むようにしました。混色処理を見直す前は同じようなことをやっていたのですが、見直し後しばらく放ってあったものです。
しかし、実際に描いているとやはり微妙な色変化のところでどんどん汚くなっていくのが気になったので、改めて実装しました。手抜き処理なので正しくはないのですが、見た目には好ましい結果が得られます。
ただ、描点をレイヤーに合成するGIMPの内部処理で発生する誤差も結構馬鹿にならないため、ブラシ不透明度を下げて、あるいはボケ足のあるブラシで描く場合には影響があるでしょう(これはMixBrushだけ弄っていても直りません)。
筆圧周りの処理を変更しました。筆圧に対応するパラメータの効きどころをより正確に指定できるようになっています。その分、設定が面倒になっているというデメリットもありますが……。
Assume that the hidden color is...の効果を再実装しました。
混色の処理を書き直しました。パラメータの項目もあれこれ変わっています。今回の変更により、透明レイヤーにペイントしても破綻することはなくなったと言えるでしょう。ただし、レイヤーのアルファチャンネルは基本的に不透明になっていく方向にしか干渉できないので、ベタの地に直接ペイントするのと異なる結果になるのは避けられません(不透明度の変化が不自然)。
レイヤーのアルファを描点のアルファ値に置き換えることができれば、違いがある程度埋められるのではないかと思うので、どうやって差し替えようかと現在考えているところです。
今回の版では次の機能が使えません。
また、次の機能が使えるようになっています。
重ね塗りのチェックを外した際に、ストロークの重なる部分や交差する部分のカラーが壊れる仕様を改善し、壊れないようにしました(まだ若干不具合が残っているかもしれませんが、おおむね「使える」状態にはなっていると思います)。
従来はこの仕様のため、「圧力感度」の「色」や「グラデーションの色を使う」を有効にすると重ね塗りモードが強制されるようになっていました(素のGIMPの仕様が元々そういう風になっています)。
Canvas colorの筆圧の適用方法を元に戻しました。ただし、正負を逆にしてありますので注意してください(10月25日版を基準にした場合、29日版の正負は同じとなります。多分……)。
デフォルト値は10月22日版以前と同じになるように、-0.8を設定してあります。
グレースケールの画像またはチャンネルにペイントする際、不透明度を正しく扱えていなかったので修正しました。
10月25日版では、Remove the background colorがグレースケールやインデックスカラーでも動作していましたが、RGBモードに特化した処理なので適切な結果は得られませんでした。10月29日版ではRGBモードのみで処理を行うように修正しました。他のモードでチェックが入っていても、処理はスキップされます。
10月21日版では、Canvas colorのRate(割合)が0になっているとDryoutが無視されてしまっていたので、これを修正しました。
必要のないAPI関数の呼び出しとメモリリークがあったので修正しました。
GIMP 2.4ではツールのクラスによって、基本的なオプション項目の表示内容をコントロールしているようです。そのため、以前の版では「圧力感度」の「大きさ」チェックボックスが表示されなくなっていました。10月21日版ではこの点が修正されています。
Bleedの動作が変更されたのに伴い、より強く混ぜられるように値の上限を0.3まで引き上げました。
ただし、Bleedの値を高くすると下地のカラーを取り込む力が強くなるので、伸びが悪くなり固まりはじめた絵の具のような感じになりますので注意してください。また、このときブラシの不透明度が高いと直前の描点の形が見えてしまい不自然に感じられるかもしれません。
実際のところ、従来の上限である0.2あたりまでにしておいた方が無難でしょう。
Sample sizeを大きくしていると、透明部分のペイントで余計な色が混じることがあります。これは平均を取ったあとに透明部分を白(背景色)に置き換える処理をしているのが関係していそうです。
いずれは、自前の平均処理を入れないとだめかなあという感じですね(範囲が広い場合は適当に間引かないと重くなるし)。