2

ウィンドウにビットマップを描画しようとしています。ビットマップの 1 ビットに対応するピクセルのみを描画する必要があります。0 ビットに対応するものはそのまま残されます。私は次のようなコードを使用しています:

XImage *image;
uint8_t bitmap[8192]; /* 256 x 256 / 8 */

memset(bitmap, 0xaa, sizeof(bitmap));

XSetForeground(g_display, g_gc, 0x000000ff);
XSetBackground(g_display, g_gc, 0x00000000);

image = XCreateImage(g_display, g_visual, 1, XYBitmap,
    0, (char *)bitmap, 256, 256, 32, 0);
XPutImage(g_display, g_wnd, g_gc, image, 0, 0, 10, 10, 255, 255);
XFree(image);

(はい、私のように色を直接指定するのは間違っていることはわかっていますが、今のところ問題ありません)。

明らかに、ビットマップの 0 ビットは背景色 (つまり黒) で描画されます。絶対に描かないでほしい。それを実装するための最良のアプローチは何ですか?マスクなどを指定する方法はありますか?

4

1 に答える 1

3

まず、不透明なビットマップの場合、ビットマップ データから完全な深度の画像を作成する必要はありません。1 ビットのピックスマップを作成して使用しますXCopyPlane

透明なビットマップの場合、GC のクリップ マスクを操作する必要があります。

Pixmap bitmap;
...; /* create 1-bit-deep pixmap */
XSetClipMask(display, gc, bitmap);
XSetClipOrigin(display, gc, x, y);
/* 1-bits of the bitmap are filled with the foreground color,
   and 0-bits are left intact */
XFillRectangle(display, window, gc, x, y, width, heiht);
于 2012-05-09T10:56:57.997 に答える