コンテンツにスキップ

X Window Programming/描画とグラフィックス

出典: フリー教科書『ウィキブックス(Wikibooks)』

X Window Systemにおける描画とグラフィックスは、GUIアプリケーションのビジュアル要素を実現するために不可欠です。基本的な描画操作から、フォントやテキストの描画、色やカラーマップの管理まで、多岐にわたる操作を行うことができます。本章では、UNIX環境における描画操作、フォントの設定、カラーマップの管理方法について説明します。

基本的な描画操作

[編集]

X Window Systemでは、ライン、矩形、円などの基本的な図形を描画するための関数が提供されています。これらの描画操作は、ウィンドウにビジュアルコンテンツを描写するために必要不可欠です。

  • ライン、矩形、円の描画
    これらの図形は、X11の描画関数で簡単に描画できます。例えば、ラインを引いたり、矩形や円を描いたりするために以下の関数を使用します。
    #include <X11/Xlib.h>
    
    int main() {
        Display *display = XOpenDisplay(NULL);
        if (!display) {
            fprintf(stderr, "Xサーバーに接続できません\n");
            return -1;
        }
    
        int screen = DefaultScreen(display);
        Window window = XCreateSimpleWindow(display, RootWindow(display, screen),
                                            10, 10, 400, 300, 1,
                                            BlackPixel(display, screen),
                                            WhitePixel(display, screen));
    
        XMapWindow(display, window);
        XSelectInput(display, window, ExposureMask);
    
        XGCValues values;
        GC gc = XCreateGC(display, window, 0, &values);  // GCの作成
    
        for (;;) {
            XEvent event;
            XNextEvent(display, &event);
            if (event.type == Expose) {
                // ラインを描画
                XDrawLine(display, window, gc, 10, 10, 200, 200);
    
                // 矩形を描画
                XDrawRectangle(display, window, gc, 50, 50, 100, 100);
    
                // 円を描画
                XDrawArc(display, window, gc, 150, 150, 100, 100, 0, 360*64);
            }
        }
    
        XCloseDisplay(display);
        return 0;
    }
    

上記のコードでは、ウィンドウにライン、矩形、円を描画しています。XDrawLine(), XDrawRectangle(), XDrawArc()といった関数を使用し、描画操作を行っています。

  • グラフィックスコンテキスト (GC) の設定と活用
    描画操作において重要なのは、グラフィックスコンテキスト(GC)の設定です。GCは、線の色、太さ、塗りつぶしのスタイルなど、描画の属性を定義します。GCを設定することで、複数の描画操作に対して一貫したスタイルを適用できます。
    #include <X11/Xlib.h>
    
    int main() {
        Display *display = XOpenDisplay(NULL);
        if (!display) {
            fprintf(stderr, "Xサーバーに接続できません\n");
            return -1;
        }
    
        int screen = DefaultScreen(display);
        Window window = XCreateSimpleWindow(display, RootWindow(display, screen),
                                            10, 10, 400, 300, 1,
                                            BlackPixel(display, screen),
                                            WhitePixel(display, screen));
    
        XMapWindow(display, window);
        XSelectInput(display, window, ExposureMask);
    
        XGCValues values;
        GC gc = XCreateGC(display, window, 0, &values);  // GCの作成
    
        // GCの設定(線の色を赤に設定)
        XSetForeground(display, gc, 0xFF0000); // 赤色
    
        for (;;) {
            XEvent event;
            XNextEvent(display, &event);
            if (event.type == Expose) {
                // 設定したGCを使用して、赤いラインを描画
                XDrawLine(display, window, gc, 10, 10, 200, 200);
            }
        }
    
        XCloseDisplay(display);
        return 0;
    }
    

このコードでは、XSetForeground()を使って描画する色を赤色に設定し、その後、XDrawLine()で赤いラインを描画しています。

フォントとテキスト描画

[編集]

X11では、テキストを描画するためにフォントの設定が重要です。フォントを設定することで、画面に表示する文字をカスタマイズできます。

  • フォントパスの設定(/usr/share/fontsなど)
    UNIX環境では、システム全体で使用するフォントが通常、/usr/share/fontsディレクトリ以下に格納されています。X11アプリケーションがフォントを使用するには、このフォントパスを指定する必要があります。XOpenFont()を使用して、指定したフォントを開くことができます。
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    
    int main() {
        Display *display = XOpenDisplay(NULL);
        if (!display) {
            fprintf(stderr, "Xサーバーに接続できません\n");
            return -1;
        }
    
        int screen = DefaultScreen(display);
        Window window = XCreateSimpleWindow(display, RootWindow(display, screen),
                                            10, 10, 400, 300, 1,
                                            BlackPixel(display, screen),
                                            WhitePixel(display, screen));
    
        XMapWindow(display, window);
        XSelectInput(display, window, ExposureMask);
    
        // フォントのオープン
        Font font = XLoadFont(display, "fixed");  // 'fixed'フォントを使用
    
        XGCValues values;
        GC gc = XCreateGC(display, window, 0, &values);  // GCの作成
        XSetFont(display, gc, font);  // フォントの設定
    
        for (;;) {
            XEvent event;
            XNextEvent(display, &event);
            if (event.type == Expose) {
                // フォントを設定してテキストを描画
                XDrawString(display, window, gc, 50, 50, "こんにちは、X Window System!", 24);
            }
        }
    
        XCloseDisplay(display);
        return 0;
    }
    

この例では、XLoadFont()を使ってシステムフォント(fixed)をロードし、XDrawString()でウィンドウにテキストを描画しています。

色とカラーマップ

[編集]

X11では、色を管理するためにカラーマップを使用します。カラーマップは、表示する色を管理するためのリソースで、特にモノクロディスプレイやカラーパレットが制限されている場合に重要です。

  • UNIX上のカラーマップ操作
    X11では、Colormapオブジェクトを使用して色を管理します。デフォルトのカラーマップは、DefaultColormapとして提供されており、カラーマップを変更するにはこのオブジェクトを操作します。
    #include <X11/Xlib.h>
    
    int main() {
        Display *display = XOpenDisplay(NULL);
        if (!display) {
            fprintf(stderr, "Xサーバーに接続できません\n");
            return -1;
        }
    
        int screen = DefaultScreen(display);
        Colormap colormap = DefaultColormap(display, screen);
    
        XColor color;
        color.red = 0xFFFF;
        color.green = 0x0000;
        color.blue = 0x0000;  // 赤色
    
        // 色をカラーマップにセット
        XAllocColor(display, colormap, &color);
    
        Window window = XCreateSimpleWindow(display, RootWindow(display, screen),
                                            10, 10, 400, 300, 1,
                                            BlackPixel(display, screen),
                                            WhitePixel(display, screen));
    
        XMapWindow(display, window);
        XSelectInput(display, window, ExposureMask);
    
        XGCValues values;
        GC gc = XCreateGC(display, window, 0, &values);  // GCの作成
        XSetForeground(display, gc, color.pixel);  // カラーマップから色を設定
    
        for (;;) {
            XEvent event;
            XNextEvent(display, &event);
            if (event.type == Expose) {
                // 設定した色で矩形を描画
                XFillRectangle(display, window, gc, 50, 50, 200, 200);
            }
        }
    
        XCloseDisplay(display);
        return 0;
    }
    

この例では、カラーマップを使用して赤色を設定し、矩形をその色で塗りつぶしています。

  • モノクロディスプレイ対応の注意点
    モノクロディスプレイを使用する場合、色を扱う際に注意が必要です。モノクロディスプレイでは、色の設定が意味を持たないため、描画内容をシンプルに保ち、明暗やパターンを活用することが重要です。