我想在X11中使用Xlib制作纹理图集。我通过从图像文件中加载像素数据创建了一个像素图,该图像文件包含将用作纹理的所有精灵。我可以将纹理地图集像素图的一部分(单一精神)成功复制到另一个作为屏幕外可绘制对象创建的像素图。
问题来了。我希望将纹理以部分透明的方式复制到目标像素图,以便每个精神后面都不会出现背景矩形。为此,我为整个纹理图集图像(500 * 500)创建了一个深度等于1的像素图。
pMaskData
是深度为1的像素数据。
Pixmap texAtlasMask = XCreatePixmapFromBitmapData(kTheDisplay, kRootWindow,
(char*)pMaskData, 500, 500, 1, 0, 1);
然后我通过首先创建一个深度为1的像素图,为单个精灵创建一个clip_mask像素图,该图片的大小为16 * 16。
Pixmap clipMask = XCreatePixmap(kTheDisplay, kRootWindow, 16, 16, 1);
然后使用以下调用填充clipMask
的内容:
// Error occurs here
// reqest code: 62:X_CopyArea
// Error code: 8:BadMatch (invalid parameter attributes)
XCopyArea(kTheDisplay, texAtlasMask, clipMask, m_gc, 0, 0,16, 16, 0, 0);
之后:
XSetClipMask(kTheDisplay, m_gc, clipMask);
// Copy source spirit to backing store pixmap
XSetClipOrigin(kTheDisplay, m_gc, destX, destY);
XCopyArea(kTheDisplay, m_symAtlas, m_backStore, m_gc, srcLeft, srcTop,
width, height, destX, destY);
m_symAtlas
是纹理地图集像素图,m_backStore
是我们要绘制到的目标像素图。
如上所列,在XCopyArea的第一次调用中发生错误。我尝试了XCopyPlane,但没有任何改变。
我玩弄XCopyArea,发现只要pixmap的深度为32,XCopyArea就可以正常工作,但当深度不为32时,它会失败。你知道哪里出了问题吗?