私は自分のウィンドウマネージャーをコーディングし始めており、xorg api を使用して生の画像データ ( libpng によって提供されるデータなど) から Xorg Pixmap または Xorg によって描画可能なものに取得する方法を知りたいと思っていましたか?
3 に答える
おそらく2008年以降のある時点でこれを発見したでしょうが、将来の読者のために...
XCreatePixmapFromBitmapData() は、リテラル ビットマップ (つまり、1 ビット、白黒) データをピックスマップにロードします。目標が PNG からロードすることである場合、これはおそらくあなたが望むものではありません。
これを行う新しい方法は、Cairo または GdkPixbuf を使用することです。XCreatePixmapFromBitmapData() や XDrawWhatever() などの古い学校の Xlib API はすべて、ほとんど非推奨です (実際に削除されるわけではありませんが、時代遅れであり、最新のアプリの動作と同期していません)。
最近、人々が一般的に推奨する方法は次のとおりです。
- libxcb を libX11 より優先します。libxcb は X プロトコルの非常に薄いラッパーであり、複数の X プロトコル要求を実行する呼び出しがありません (たとえば、CreatePixmapFromBitmapData は CreatePixmap、CreateGC、PutImage、FreeGC を実行します)。
- サーバー側の描画 API よりも cairo (または同等のライブラリ、Skia がその 1 つ) を好む
単純な目的で cairo_image_surface_create_from_png() を使用するか、より多くのフォーマットをサポートする必要がある場合は GdkPixbuf を使用できます。
XCreatePixmapFromBitmapData はまさにそれを行うべきです。xserver が使用しているのと同じビット深度のデータをフィードする必要があることに注意してください。
XCreateImage、XCreatePixmap、および XCopyArea については、少し手間がかかります。次のようになります。
struct Image img = get_pixels_and_geometry_from_libpng("filename.png");
XImage *img = XCreateImage(/*5000 paremeters*/);
Pixmap pixmap = XCreatePixmap(dpy, img.width, img.height, 24);
XPutImage(dpy, pixmap, gc, 0, 0, img.width, img.height);
XCopyArea(dpy, pixmap, window, 0, 0, img.width, img.height, x, y);