「Xプロトコルリファレンスマニュアル:ボリュームゼロ」のコピーに基づいて、Windows用のX11サーバーをゼロから構築する作業を行っています。私はメッセージを解読し、クライアントと有意義な会話をすることで多くの進歩を遂げましたが、描画呼び出しが実際に何をすべきかを理解するのに苦労しています。
この例のメッセージは、Linuxマシンでxbiffを実行し、Windowsでxserverと通信することから発生します。プロトコルの解釈に誤りがあった可能性は十分にありますが、データは今のところほぼ正しいようです。
グラフィックス呼び出しはこれから始まり、クライアントはルートウィンドウID(90)をドローアブルとしてグラフィックスコンテキストを作成します。
X_CreateGC: ID: 2097152, Drawable: 90, ValueMask: 8, Value0: 16777215
ルートウィンドウに基づいてGCを作成することの重要性は何ですか?
次に、2つの48x48ピックスマップを作成し、それらに画像を配置します。
X_CreatePixmap: Depth: 1, ID: 2097153, Drawable: 90, Width: 48, Height: 48
X_CreateGC: ID: 2097154, Drawable: 2097153, ValueMask: 12, Value0: 1, Value1: 0
X_PutImage: Format: 0, Size: 408, Drawable: 2097153, GraphicsContext: 2097154, Width: 48, Height: 48, X: 0, Y: 0, LeftPad: 0, Depth: 1
X_FreeGC: Graphics Context: 2097154
X_CreatePixmap: Depth: 1, id: 2097155, Drawable: 90, Width: 48, Height: 48
X_CreateGC: ID: 2097156, Drawable: 2097155, ValueMask: 12, Value0: , Value1: 0
X_PutImage: Format: 0, Size: 408, Drawable: 2097155, Graphics Context: 2097156, WIdth: 48, Height: 48, X: 0, Y: 0, LeftPad: 0, Depth: 1
X_FreeGC: Graphics Context: 2097156
これのGCはMemoryDCと同等であり、最終結果は、PutImage呼び出しにあったデータを含むメモリ内の2つの48x48ビットマップになるはずだと考えるのは正しいですか?
ここでは、ルートウィンドウに基づいて別のグラフィックスコンテキストが作成されますが、その理由がわかりません。
X_CreateGC: ID: 2097157, Drawable: 90, ValueMask: 65544, Value0: 16777215, Value1: 0
次に、2つの48x48ウィンドウを作成します。1つはルートを親として、もう1つは最初のウィンドウを親として作成します。
X_CreateWindow: Depth: 24, ID: 2097158, Parent: 90, X: 0, Y: 0, Width: 48, Height: 48, BorderWidth: 1, Class: 1, Visual: 0, Bitmask: 10266, Value0: 16777215, Value1: 0, Value2: 1, Value3: 6422576, Value4: 32
X_CreateWindow: Depth: 24, ID: 2097161, Parent: 2097158, X: 0, Y: 0, Width: 48, Height: 48, BorderWidth: 0, Class: 1, Visual: 0, Bitmask: 26650, Value0: 16777215, Value1: 0, Value2: 0, Value3: 163852, Value4: 32, Value5: 0
これは、同じサイズと原点を持つウィンドウを内部に持つ48x48のベースウィンドウを作成しているようです。その意味は何ですか?サブウィンドウはルートウィンドウを覆い隠して冗長な呼び出しにしませんか?
次に、上で作成した子ウィンドウに基づいて、幅と高さが0のCreatePixmap呼び出しを取得します。
X_CreatePixmap: ID: 2097162, Drawable: 2097161, Width: 0, Height: 0
これの目的は何ですか?
次に、xbiff(クライアント)は子ウィンドウに基づいて別のグラフィックスコンテキストを作成し、48x48ピックスマップの1つから子ウィンドウにCopyPlaneを実行します。
X_CreateGC: ID: 2097163, Drawable: 2097161, ValueMask: 65544, Value0: 16777215, Value1: 0
X_CopyPlane: SrcDrawable: 2097155, DestDrawable: 2097162, GraphicsContext: 2097163, SrcX: 0, SrcY: 0, DstX: 0, DstY: 0, Width: 0, Height: 0, Bitplane: 1
X_FreeGC: 2097163
この呼び出しの幅と高さは0です。それはNOOPになりますか、それとも0x0のサイズは「すべてをコピーする」ことを意味しますか?もしそうなら、これはビットマップを子ウィンドウにブリットするだけですよね?
次に、クライアントは子ウィンドウに基づいて0x0ピックスマップを作成します。
X_CreatePixmap: Depth: 24, ID: 2097164, Drawable: 2097161, Width: 0, Height: 0
0x0ピックスマップは何が良いですか?それはどういうわけか「ウィンドウの寸法をコピーする」という意味ですか?
ここでは、子ウィンドウのGCを作成し、48x48ビットマップの1つからウィンドウへのCopyAreaを実行します。
X_CreateGC: ID: 2097165 Drawable: 2097161, ValueMask: 65548, Value0: 16777215, Value1: 0, Value2: 0
X_CopyArea: SrcDrawable: 2097153, DestDrawable: 2097164, GraphicsContext: 2097165, SrcX: 0, SrcY: 0, DstX: 0, DstY: 0, Width: 0, Height: 0, Bitplane: 1
このCopyArea呼び出しの幅と高さも0です。これは、「すべてをコピーする」という意味ですか?
次に、2097158(ルートに接続されている親)のサブウィンドウをマップしてから、親自体をマップします。
X_MapSubwindows: Window: 2097158
[We send a MapNotify and Expose event for window 2097161]
X_MapWindow: Window: 2097158
[We send a MapNotify and Expose event for window 2097158]
後で子ウィンドウでClearAreaが呼び出される理由がわかりません。
X_ClearArea: Window: 2097161, X: 0, Width: 0, Width: 0, Height: 0
それは何もクリアしませんか、それとも全部をクリアしますか?
次に、CopyArea呼び出しは、0x0ピックスマップを以前の場所から24x24の場所にある子ウィンドウにコピーします。
X_CopyArea: SrcDrawable: 2097162, DestDrawable: 2097161, GraphicsContext: 2097157, SrcX: 0, SrcY: 0, DstX: 24, DstY: 24, Width: 0, Height: 0
幅と高さもゼロです。繰り返しになりますが、理由はわかりません。
X11描画呼び出しがどのように機能するのか、そしてなぜ奇妙な(私にとって)呼び出しがそのようになっているのかを理解するのに役立つことを嬉しく思います。