X Window Programming/描画とグラフィックス
表示
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; }
- UNIX環境では、システム全体で使用するフォントが通常、
この例では、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; }
- X11では、
この例では、カラーマップを使用して赤色を設定し、矩形をその色で塗りつぶしています。
- モノクロディスプレイ対応の注意点
- モノクロディスプレイを使用する場合、色を扱う際に注意が必要です。モノクロディスプレイでは、色の設定が意味を持たないため、描画内容をシンプルに保ち、明暗やパターンを活用することが重要です。