次回の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側でもメンテナンスやサポートが終了していますので、その点についてはあらかじめご了承ください。
◇
最後に、今回の修正によってご迷惑をお掛けしてしまう方には、重ねてお詫び申し上げます。
リニアングラフ3DのVCSSL用APIにカメラ制御関数を追加、回転アニメーションツールも同梱
2019年10月09日 -
RINEARNでは10月9日にソフトウェアの最新版をリリースしました。VCSSLのAPI関数の追加や、リニアングラフ3Dのアニメーションツールの追加など行っています。その概要をお知らせします。
小型関数電卓 RINPn(旧称リニアンプロセッサー nano)の公式ページを開設
2019年10月02日 -
現在オープンソースで開発中の、「シンプル&コンパクト」を目指した小型プログラマブル関数電卓ソフト「 RINPn 」の公式ページが、RINEARNサイト内にオープンしました。その概要をお知らせします。
Vnanoの公式サイトがオープン、チュートリアルやAPI仕様書等も掲載
2019年08月07日 -
オープンソースのアプリケーション組み込み用スクリプトエンジン「 Vnano 」の公式サイトを開設しました。チュートリアルや、スクリプトエンジンのAPI仕様書などが参照できます。その概要をお知らせします。
リニアングラフ3D/2Dが連番ファイルのアニメーションに標準で対応
2019年07月17日 -
リニアングラフ3D/2Dでは、7月17日公開の最新版より、連番ファイルを連続的に読み込みながらアニメーション描画するプログラムを同梱し、メニューから標準で使用可能になりました。その概要をお知らせします。
Vnanoのスクリプトエンジンアーキテクチャ解説2: コンパイラ
2019年07月03日 -
オープンソースで開発中のスクリプトエンジン「 Vnano 」のアーキテクチャを解説する連載の第2回です。今回は、スクリプトを中間コードへと変換する、コンパイラ部分の内部をクローズアップして解説します。
Vnanoのスクリプトエンジンアーキテクチャ解説1: 全体像
2019年05月28日 -
RINEARNでは現在、 アプリケーション組み込み用スクリプトエンジン「 Vnano 」を、オープンソースで開発中です。今回は、このスクリプトエンジンのアーキテクチャ面を掘り下げて解説します。複数回の連載予定です。
リニアンプロセッサー nano の先行開発版やソースコードリポジトリを公開
2019年04月16日 -
オープンソースで開発中の小型プログラム関数電卓ソフト、「 リニアンプロセッサー nano 」の先行開発版やソースコードリポジトリを公開しました。概要と使用方法、ビルド方法などについて解説します。
各ソフトウェアの最新版を一括でリリース、OpenJDKのJava実行環境(JRE)に対応
2019年03月06日 -
RINEARNでは3月6日に、主要なソフトウェアの最新版を一括でリリースしました。今回のアップデートには、以前お知らせした、OpenJDKで生成したJREへの対応が含まれています。その概要等をお知らせします。
次回のVCSSL 3.4.10において、関数1個の挙動に非互換な修正が適用されます
2019年02月12日 -
VCSSLの次回の正式リリース版3.4.10において、これまでドキュメントと実際の挙動が異なっていた描画系の関数1個に、非互換な修正が適用されます。その詳細と、使用コードでの対応方法について解説します。
RINEARNのソフトウェア向けにOpenJDKで生成したJava実行環境(JRE)の提供を開始
2019年02月06日 -
Javaのリリースモデル変更への対応として、OpenJDKのjlinkツールを用いて、RINEARNのソフトウェア実行用に生成したJava実行環境(JRE)の提供を開始しました。その詳細と、今後の方針について解説します。
シンプル&コンパクトなプログラム関数電卓! 「 リニアンプロセッサー nano 」の概要
2019年01月26日 -
RINEARNでは現在、プログラム関数電卓ソフト「 リニアンプロセッサー 」の派生版として、シンプル&コンパクトな方向性を目指した「 リニアンプロセッサー nano 」を開発中です。その概要をご紹介します。