【问题标题】:Drawing a graphic with a transparent color using xlib使用 xlib 绘制具有透明颜色的图形
【发布时间】:2021-08-11 00:35:33
【问题描述】:

使用 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);

【问题讨论】:

  • 嘿伙计。对不起,我不知道你的问题的答案。我稍微编辑了标题,以将您的案例与需要显卡的案例区分开来。
  • 是否有创建和应用蒙版的方法?

标签: c xlib pixmap


【解决方案1】:

这是一种可能的解决方案。如果可能的话,我会重视更好的答案。

// 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_);
  }

【讨论】:

  • 对 XCreatePixmap 的调用:我已将 24 替换为全局 XDepth,其派生如下:XDisplay = XOpenDisplay (NULL); XScreen = DefaultScreen (XDisplay); XDepth = DefaultDepth (XDisplay, XScreen);
猜你喜欢
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多