# usecanvas

Scilabグラフィックで使用されるメイン要素を取得/設定.

## 呼び出し手順

                [canvasused] = usecanvas([usecanvasfordisplay]);

## 引数

canvasused

  論理値:

  - グラフィックディスプレイに"GLCanvas" を 使用する場合は`%T` (uicontrols とグラフィックは混用 できません).

  - グラフィックディスプレイに"GLJPanel" を 使用する場合は`%F` (uicontrols とグラフィックは混用 できません).

usecanvasfordisplay

  Boolean:

  - グラフィックディスプレイに"GLCanvas" を 使用する場合は`%T` (uicontrols とグラフィックは混用 できません).

  - グラフィックディスプレイに"GLJPanel" を 使用する場合は`%F` (uicontrols とグラフィックは混用 できません).

## 説明

Scilabはグラフィック(plot3d, plot, ...)を表示する際に"GLJPanel" (Swing OpenGL要素)を使用します. この要素は, いくつかのプラットフォームに正しくサポートされていない (オペレーティング・システム, ビデオカード, ドライバ ...に依存する) いくつかの高レベルOpenGLプリミティブを使用します.

"GLCanvas" (AWT + OpenGL) は, Javaフレームワークで提供される 別の要素です. Scilabはグラフィックを描画する際にこれを使用することができます. しかし, この要素を使用するとプロットと uicontrolの混用のようないくつかの機能が無効となります(デモGUI/UIcontrol2参照). これがこの機能がデフォルトとなっていない理由です.

いくつかの特殊なケースでは, Scilab開始時に"GLCanvas"要素の使用が強制されます (最初にグラフィック関数が使用される際に警告メッセージが表示されます), 以下にこれらのケースの一覧を示します:

オペレーティング・システム | ビデオカード | 詳細
64ビットWindows | All | When Scilab is used in a remote session.
Linux | NVIDIAカード | フリードライバを使用.
ATIカード | フリードライバまたはバージョン< 8.52.3の ATIドライバ(インストーラ バージョン < 8.8 / OpenGL バージョン < 2.1.7873).
INTELカード | 直接レンダリングが有効になります.

Scilabにより`usecanvas`を用いてこの要素を動的に有効にします:

- `usecanvas(%T)`はプロット描画に "GLCanvas" を使用します.

- `usecanvas(%F)` はプロット描画に "GLJPanel" を使用します. 使用する設定において"GLJPanel"で問題が発生することが既知の場合 (上の表を参照),警告メッセージが表示されます.

"GLJPanel"を使用することできる環境であると信じているにも関わらず, Scilabが自動的に "GLCanvas" の使用を強制する場合,設定を "GLJPanel" (`usecanvas(%F)`)に切り替え, 何か(例えば`plot3d()`)をプロットしてみてください. Scilabグラフィックが動作する場合, emailを`scilab.support@scilab.org`に送信し, オペレーティング・システム/ビデオカード/ビデオカードドライバの バージョンを我々に知らせてください. これによりScilabの将来のバージョンを改良できるようになります.

## Workaround

このコードは,グラフィックカードの問題に関連する潜在的な問題の多くを 修正します.性能が低下することに注意してください.

        system_setproperty("jogl.gljpanel.nohw","");

## 技術的な側面

バージョン 5.0以降, ScilabはJOGL(the Java Binding for the OpenGL)の 先進的な使用として, Java2D OpenGLパイプラインを使用しています. 性能上の理由により,Java2D OpenGLパイプラインを使用しています. より技術的な側面から, `pbuffer`と呼ばれる グラフィックカードの内部バッファを使用します.

グラフィックカードのドライバがこのアプローチを正しくサポートしていない 場合に問題が発生する可能性があります. 既知のように, Linuxではこの機能を処理するフリードライバは 存在しません. Intelのプロプライエタリな世界では,状況は以下のようになります:

- `NVIDIA`: Nvidia は適当なプロプライエタリドライバを 提供します. Scilabのグラフィックは多くのNVIDIAドライバで 問題なく動作します.

- `ATI`: ドライババージョン8.8以降, 多くの ATIグラフィックはLinuxでpbufferをサポートします.

- `Intel`: これがpbufferの大きな欠点です. 公式なIntelのドライバはLinuxでpbufferをサポートしていません.

この問題に立ち向かうためのLinux用の回避策がありますが, 解決策はソフトウェアアクセラレータドライバを使用することです. これを行うには, `/etc/X11/xorg.conf`で, Section "Device"を探し, オプションDriverを vesaに変更します:

    Section "Device"
            Identifier      "Your Graphic card"
            Driver  "vesa"
    [...]
    EndSection

残念なことに, この解はScilabをかなり遅くします.

Windowsでは, ビデオカードの製造元は定期的に更新しており, `pbuffers`は管理されています. 最近のドライバを以下の場所からダウンロードしてください:

- `ATIカード`の場合: http://ati.amd.com/support/driver.html

- `Intelカード`の場合: http://www.intel.com/support/graphics/

- `Matroxカード`の場合: http://www.matrox.com/graphics/en/support/drivers/

- `NVIDIAカード`の場合: http://www.nvidia.com/content/drivers/drivers.asp

- `S3カード`の場合: http://www.s3graphics.com/en/resources/drivers/index.jsp

- `SiSカード`の場合: http://www.sis.com/download/

- `VIAカード`の場合: http://www.viaarena.com/default.aspx?PageID=2

(ビデオドライバが古くなったり,サポートされていない) Windows 2000においても何らかの問題が発生する可能性があります.

pBufferが問題を発生する場合, `pbuffer`が動作するのを待つのは解決策ではありません: OpenGLコミュニティはpbufferからフレームバッファオブジェクト拡張 に移行しつつあります. この拡張は移植性に優れ,オフスクリーン描画に関してpbufferよりも より高い性能を得ることができます. JOGLチームはこの問題を修正中です.

この問題に関する詳細については以下を参照ください:

- `JoGL` bug database: Bug #366

- `Scilab` bug database: Bug #3525

- `Debian` bug database: Bug #501799

- `Freedesktop` bug database: Bug #17603

## 例

    // GLJPanelの使用例 (uicontrolsおよびグラフィックの混用)
    usecanvas(%F);
    plot2d();
    uicontrol("String", "Close the window", "Position", [10 10 100, 25], "Callback", "delete(gcf())");
    messagebox("You can see the button on the figure.", "Usecanvas example", "info");

    // GLCanvasの使用例 (uicontrolsとグラフィックを混用せずに, uicontrolsは不可視)
    usecanvas(%T);
    plot2d();
    uicontrol("String", "Close the window", "Position", [10 10 100, 25], "Callback", "delete(gcf())");
    messagebox("You can''t see any button on the figure.", "Usecanvas example", "info");