※このバグは2021年のVSTGUI 4.10以降は修正されています。
VSTGUI1の再描画バグについての修正情報です。この記事はVST3プラグインを書く人向けの内容です。
TL;DR
- VSTGUIで長らく放置されていた再描画バグが最近ようやく修正された
-
修正版はGitHubの公式リポジトリのdevelopブランチから取得可能
4.10以降は配布版も修正されています
背景
自作VST3プラグインをFL Studioで使っていると、ウィンドウが重なったときに再描画されずに黒くなってしまうバグが以前からありました。VST3 SDKの公式サンプルプログラムagainをビルドしただけでこの状態なので、プラグイン実装の問題ではなくDAWかGUIライブラリにバグがあることは明らかです。
目立つバグなのになぜかずっと修正されずにいたもので、自分も1年くらい前に対策方法を求めてネット上の情報を探してみたのですが良い情報は見つからずあきらめかけていました。
今回、ツイッターの情報をもとにあらためて調べてみたら、最近ようやく修正されたということが判明したのでまとめておきます。
修正の経緯
2020年9月のSteinberg公式フォーラムのこの投稿がきっかけになったようです。
VSTGUI on other hosts
https://forums.steinberg.net/t/vstgui-on-other-hosts/202038
VSTGUIのメインコントリビューターであるArne_Schefflerさんの返信によると、自分のFL Studioでは再描画バグは再現しないとのこと。なるほど、それで今まで放置されていたんですね。
元の投稿者のdenis_prophetさんの指摘によると、VSTGUIのソースコードに含まれる、win32frame.cppのif文の条件を変えるとバグが発生しなくなるとのことです。
修正前
if (updateRegionList->rdh.nCount > 1)
修正後
if (updateRegionList->rdh.nCount > 0)
ここでupdateRegionListは、Windows APIのRGNDATA構造体、rdhメンバはRGNDATAHEADER構造体です。つまり再描画すべき複数の矩形情報を保持しているようです。そう考えれば、再描画領域が1より多いときに分岐するのではなく、ひとつ以上ある場合に分岐する修正版の処理の方が正しいように思われます。
他の人もこの投稿に感謝している返信が多く、この修正方法は信頼できそうです。試しに手元の環境でもwin32frame.cppに同様の変更をおこないVSTGUIとプラグインをビルドしなおして試してみたところ、プラグインウィンドウが重なった場合でも正常に表示されようになることを確認しました。
公式対応の状況
フォーラムは公式対応の約束や問題のクローズが宣言されておらず微妙に宙に浮いたような感じですが、GitHubのVSTGUIリポジトリを見てみると、2021年1月に当該箇所のパッチがあたっていました。
fix redraw issue with some hosts and simplify dirty region handling
https://github.com/steinbergmedia/vstgui/commit/296fdeacfc853065ca27c8da8435a5fe2a1b6600#diff-7cf79145dcf00dffc51a9e34004c93dd7038259717a6d0ef3385bc99adc78ecb
ずっと悩まされていたバグが公式に修正されたのは大変喜ばしいことです。
2021年8月10日にリリースされたVST3SDK3.7.3で修正されていることを確認しました。
-
VST3 SDKに同梱される公式GUIライブラリ ↩