c - 使用 xlib 绘制具有透明颜色的图形
问题描述
使用 Xlib:我正在尝试显示具有透明颜色(颜色)的像素图。那是一种显示背景的颜色。目前使用 XCopyArea () 绘制完全不透明的像素图。我怎样才能使它透明(像 XDrawString 一样工作)?
谢谢
GC pixgc = XCreateGC (XDisplay, pix, 0, NULL);
XSetForeground (XDisplay, pixgc, ColourToXColour (RGB (0xff, 0xFF, 0xff)));
XFillRectangle (XDisplay, pix, pixgc, 0, 0, 32, 32);
XSetForeground (XDisplay, pixgc, ColourToXColour (RGB (0x00, 0x80, 0x80)));
XDrawLine (XDisplay, pix, pixgc, 8, 8, 8 + 16, 8 + 16);
XDrawLine (XDisplay, pix, pixgc, 8, 8 + 16, 8 + 16, 8);
XDrawArc (XDisplay, pix, pixgc, 6, 6, 20, 20, 0, 270 * 64);
XCopyArea (XDisplay, pix, Res->XWindow, DefaultGC (XDisplay, XScreen), 0, 0, 32, 32, 10, 50);
解决方案
这是一种可能的解决方案。如果可能的话,我会重视更好的答案。
// Mask is Black & White. Areas in Source corresponding White areas in Mask are drawn on Dest
bool CopyArea (Drawable Source, Drawable Dest, Drawable Mask, GC gc, int x, int y, int Width, int Height, int DestX, int DestY)
{
int a, b;
XGCValues gcv;
int func;
Pixmap Mask_;
//
// Clear effected pixels in Dest
XGetGCValues (XDisplay, gc, GCFunction, &gcv);
func = gcv.function;
gcv.function = GXandInverted;
XChangeGC (XDisplay, gc, GCFunction, &gcv);
XCopyArea (XDisplay, Mask, Dest, gc, x, y, Width, Height, DestX, DestY);
// Generate coloured Mask to OR into Dest
Mask_ = XCreatePixmap (XDisplay, Dest, Width, Height, 24); // First make a copy of Mask
gcv.function = GXcopy;
XChangeGC (XDisplay, gc, GCFunction, &gcv);
XCopyArea (XDisplay, Mask, Mask_, gc, x, y, Width, Height, 0, 0);
gcv.function = GXand; // Then colour it to match pixels in Source
XChangeGC (XDisplay, gc, GCFunction, &gcv);
XCopyArea (XDisplay, Source, Mask_, gc, x, y, Width, Height, 0, 0);
// Copy new coloured Mask into Dest
gcv.function = GXor;
XChangeGC (XDisplay, gc, GCFunction, &gcv);
XCopyArea (XDisplay, Mask_, Dest, gc, 0, 0, Width, Height, DestX, DestY);
// Restore gc & free new Mask
gcv.function = func;
XChangeGC (XDisplay, gc, GCFunction, &gcv);
XFreePixmap (XDisplay, Mask_);
}
推荐阅读
- javascript - jQuery - 使用正则表达式使链接中的模式变为粗体
- php - 使用子值从多维数组中获取“主”键
- php - 数据库异常 – yii\db\Exception : 找不到驱动程序
- java - 在现有文件达到最大大小限制后,我需要添加 log4j 文件才能继续工作
- javascript - 如何从 javascript 上的 getUserMedia() 获取超过 3 声道的音频输入
- python - 在 Dataframe 中读取 2 个单元格值
- java - 我想按名称搜索产品并在 java 中的 JTextField 中显示名称和售价
- c# - 将 SQL 子查询转换为 LINQ
- .net - 使用限制连接到存储库的抽象控制器 - asp.net core 2
- html - 如何使用 CSS-Grid 实现响应式高度?