質問

私は独自のウィンドウマネージャーをコーディングし始めていますが、xorg apiを使用して未加工の画像データ(libpngで指定されたデータなど)からXorg PixmapまたはXorgで描画可能なものに取得する方法を疑問に思っていましたか?

役に立ちましたか?

解決

XCreatePixmapFromBitmapDataはそれを行うだけです。 xserverが使用しているのと同じビット深度のデータを入力する必要があることに注意してください。

他のヒント

おそらく2008年以降のある時点でこれを発見しましたが、将来の読者のために...

XCreatePixmapFromBitmapData()は、リテラルビットマップ(1ビット、黒<!> amp;白)データをピックスマップにロードします。目標がPNGからロードすることである場合、これはおそらくあなたが望むものではありません。

これを行う新しい方法は、CairoまたはGdkPixbufを使用することです。 XCreatePixmapFromBitmapData()やXDrawWhatever()などの古いXlib APIはすべて非推奨です(実際に削除されるわけではありませんが、最新のものではなく、最新のアプリの動作と同期していません)。

最近人々が一般的に推奨する方法は次のとおりです。

  • libX11よりlibxcbを優先、libxcbはXプロトコルの非常に薄いラッパーであり、複数のXプロトコル要求を行う呼び出しがありません(たとえば、CreatePixmapFromBitmapDataはCreatePixmap、CreateGC、PutImage、FreeGCを行います)
  • サーバー側の描画APIよりもcairo(または同等のライブラリ、Skiaがそうです)を優先します

cairo_image_surface_create_from_png()を単純な目的に使用したり、より多くの形式などをサポートする必要がある場合はGdkPixbufを使用したりできます。

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top