Solaris 環境では XSolarisGetVisualGamma(3) を呼び出してビジュアルのガンマ値を調べれば、線形性を確定することができます。ガンマ値が 1.0 に等しければ (あるいは 1.0 に近ければ) 、ビジュアルは線形です。それ以外の場合、ビジュアルは非線形です。経験上の法則として誤差の許容範囲は 10% 以内です。XSolarisGetVisualGamma API を使用するには、アプリケーションを Solaris の libXmu とリンクしなければなりません。
例 3-1 は、代表的な XGLTM 3D 線形アプリケーションに最適なビジュアルを選択する例です。この例では、線形ビジュアルが見つからない場合は非線形ビジュアルを使用しています。この例は単に、ビジュアルを選択する 1 つの方法を示すものです。
デバイス上のビジュアルのガンマが再構成または測定によって変更された場合は、ウィンドウシステムを再起動する必要があります。そうしないと、すでにXSolarisGetVisualGamma を使用して動作しているアプリケーションは変更されたビジュアルを検出できず、誤ったビジュアルを参照してしまう場合があります。
/* ** 指定されたデプス、クラス、線形性を持つビジュアルを戻す ** 見つからない場合は NULL を戻す */ Visual * match_visual (Display *dpy, int screen, int depth, int class, Bool wantLinear) { XVisualInfo template; XVisualInfo *vinfo, *vi; int nitems, isLinear, i; double gamma; template.screen = screen; template.depth = depth; template.class = class; if (!(vinfo = XGetVisualInfo(dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &template, &nitems)) || nitems <= 0) { return (NULL); } for (i = 0, vi = vinfo; i < nitems; i++, vi++) { if (XSolarisGetVisualGamma(dpy, screen, vi->visual, &gamma) == Success) { /* ** ビジュアルの線形性に関する経験則では ** ガンマが 1.0 の 10% の範囲内にあれば線形と見なされる */ isLinear = (gamma >= 0.9 && gamma <= 1.1); if ((wantLinear && isLinear) || (!wantLinear && !isLinear)) { Visual *visual = vi->visual; XFree(vinfo); return (visual); } } } XFree(vinfo); return (NULL); }
この例の main ルーチンを以下に示します。
main () { Visual vis; ... if ((vis = match_visual(display, screen, 24, TrueColor, True))) { fprintf(stderr, "Found a linear 24-bit TrueColor visual¥n"); visualClass = TrueColor; depth = 24; } else if ((vis = match_visual(display, screen, 24, TrueColor,False))){ fprintf(stderr, "Found a nonlinear 24-bit TrueColor visual¥n"); visualClass = TrueColor; depth = 24; } else if ((vis = match_visual(display, screen, 8, PseudoColor,False))){ fprintf(stderr, "Found a nonlinear 8-bit PseudoColor visual¥n"); visualClass = PseudoColor; depth = 8; } else { fprintf(stderr, "Cannot match 24 or 8 bit visual¥n"); exit(1); } ... }