次回のVCSSL 3.4.10において、関数1個の挙動に非互換な修正が適用されます

VCSSLの次回の正式リリース版3.4.10において、これまでドキュメントと実際の挙動が異なっていた描画系の関数1個に、非互換な修正が適用されます。 この記事では、その詳細と、使用コードでの対応方法について解説します。

- 目次 -

これまでドキュメントと実際の挙動が異なっていた関数

VCSSLの描画系関数の一つである drawImage 関数の内、引数が 10 個の 「 drawImage(int rendererID, int x, int y, int width, int height, int baseX, int baseY, int baseWidth, int baseHeight, int graphicsID) 」 の挙動は、これまでドキュメントに記載されていた仕様と異なっており、また、引数の名称からしてもおかしいものとなっておりました。

これはAPIの仕様と実装を対応させる際における完全なバグで、今回の件についてご迷惑をお掛けしてしまう方には、心よりお詫び申し上げます。

この件が他のバグ修正よりも問題になるのは、この関数が、仕様と異なる挙動を取りながらも、エラーにならずに動いてしまう事です。 具体的には、内部で引数の値にオフセットを加える処理が抜け落ちているため、ドキュメントの仕様と比べて、現状では引数の値をずらして指定したような挙動をします。

VCSSL 3.4.10において適用される非互換な修正と、互換性維持のための別の関数

drawImage 関数は、仕様ではなく挙動を修正(非互換)

上述のように、仕様と実際の挙動が異なるまま動作してしまうAPI関数がある場合、互換性優先で仕様(ドキュメント)を修正するか、 それとも非互換になっても関数の挙動を修正するか、の2つの選択肢があります。

RINEARNでは、その2つを慎重に検討しましたが、次回のVCSSL 3.4.10において新たにサポートされる別のAPIとの統一性や、 また問題の drawImage 関数には互換バージョンの drawGraphics 関数(後述)が存在する事などを踏まえて、 次回リリースより drawImage 関数の挙動を修正するという判断になりました。

※ なお、今回挙動が修正(変更)されるのは、drawImage 関数の中でも、引数が10個の場合だけであり、引数の個数が異なる場合は影響を受けません。

既存コード側での対応方法

引数10個の drawImage 関数を既に使用している既存のVCSSLプログラムのコードにおいて、同関数の修正に対応する方法は2通り存在します。

1つめは、drawImage 関数を使用したまま、引数の値を修正する方法です。 というのも、現状で正しく動作している既存コードは、問題の drawImage 関数のバグに合わせるために、あえてドキュメントとは異なる引数を渡すようになっている事が予想されます。 従って、drawImage 関数の修正に伴い、同関数を呼び出している箇所で、同関数に渡す引数の値を求めている処理を修正する必要があります

これは最もストレートな対応方法です。

互換性維持のためには drawGraphics 関数の使用を

一方で、既存コードの内容によっては、問題の関数を呼び出している箇所の周辺処理が込み入っているなどで、 あまり計算的な部分に手を加えたくないという場合も考えられます。 また、既存コードが、古いバージョンのVCSSLでも同じ動作をするようにしたい場合などは、 今回の修正に合わせて呼び出し側のコードを直してしまうと、 逆に古いバージョンでは動かなくなってしまうという不都合も生じます。

そのような場合のために、もう1つの対応方法として、 コード内で drawImage 関数を呼び出している箇所を、そのまま drawGraphics 関数に置き換える という方法も選択できます。

drawGraphics 関数は VCSSL 2.0 の頃からある関数で、 VCSSL 3.x 世代になってから名称変更によって現在の drawImage 関数へと移行しました。 一方で drawGraphics 関数自体も、過去のコードを動かすための互換関数として、現在も残っています。

今回の修正は、この drawGraphics 関数には適用されません。 そのため、現在(引数10個の)drawImage 関数を呼び出している箇所を、 単純なテキスト置換処理などで drawGraphics に置き換えると、従来通りの挙動を保つ事が可能です。

全くコードを変更したくない場合は…

既にメンテナンスも完全に打ち切った既存コードを、 無改変のままとりあえず書いた当時の通りに動かしたいといった場合も考えられます。 そのような場合は、VCSSLのダウンロードページから、 新バージョンのリリース後も旧バージョンの実行環境を入手できます。 ただしリンク先の説明の通り、旧バージョンの実行環境は、既にVCSSL側でもメンテナンスやサポートが終了していますので、その点についてはあらかじめご了承ください。

最後に、今回の修正によってご迷惑をお掛けしてしまう方には、重ねてお詫び申し上げます。