x11

x11

函数介绍

XCreateGC

GC XCreateGC(Display *display, Drawable d, unsigned long valuemask, XGCValues *values);

参数说明

  • display: 目标显示器的 Display 结构体,表示当前连接的 X 服务器。
  • d: Drawable 对象,它可以是一个窗口或一个 Pixmap,表示你要在哪个目标对象上进行图形操作。
  • valuemask: 一个位掩码,指示哪些字段需要从 values 结构中提取并应用。它用于选择哪些图形上下文属性是有效的。例如,你可以指定线条颜色、填充模式等。
  • values: 一个指向 XGCValues 结构体的指针,其中包含具体的图形上下文参数。根据 valuemask 的设置,XCreateGC 会读取 XGCValues 中的相应字段。

XGCValues:

typedef struct {
    Pixel foreground;        /* 前景色 */
    Pixel background;        /* 背景色 */
    int line_width;          /* 线条宽度 */
    int line_style;          /* 线条样式(实线、虚线等) */
    int cap_style;           /* 线条端点样式 */
    int join_style;          /* 线条连接点样式 */
    int fill_style;          /* 填充样式 */
    int fill_rule;           /* 填充规则 */
    int tile;                /* 图案填充的图像(如果有) */
    int stipple;             /* 点画图案 */
    int ts_x_origin;         /* 图案横坐标偏移 */
    int ts_y_origin;         /* 图案纵坐标偏移 */
    int font;                /* 字体 */
    int subwindow_mode;      /* 子窗口绘制模式 */
    int graphics_exposures;  /* 是否启用图形曝光 */
    int clip_x_origin;       /* 裁剪区域偏移 */
    int clip_y_origin;       /* 裁剪区域偏移 */
    Pixmap clip_mask;        /* 裁剪区域的掩码 */
    int dash_offset;         /* 虚线起始位置 */
    unsigned char dash_list; /* 虚线的样式 */
    int arc_mode;            /* 弧形绘制模式 */
} XGCValues;

XChangeGC

  XChangeGC 是 X11 库中的一个函数,用于 更改图形上下文(GC) 的属性。图形上下文(GC, Graphics Context)是用来描述绘制操作的一组属性,如颜色、线条宽度、填充样式等。这个函数允许你动态地修改这些属性,而无需创建新的图形上下文。

int XChangeGC(Display *display, GC gc, unsigned long valuemask, XGCValues *values);

参数解释:

  1. display:

    • 指向一个有效的 Display 连接对象的指针,表示要操作的 X11 显示服务器。
    • 通过 XOpenDisplay() 获取。
  2. gc:

    • 要更改的图形上下文(GC)。这通常是在绘制操作之前创建的 GC。
    • 你可以通过 XCreateGC() 创建一个新的 GC。
  3. valuemask:

    • 一个位掩码,指示要更改的 GC 属性。此值指示 XGCValues 结构体中哪些字段需要更新。位掩码的值是一个按位与操作的集合,具体的选项有:
      • GCForeground:前景色(绘制图形时的颜色)
      • GCBackground:背景色
      • GCFillStyle:填充样式(如实心填充或点状填充)
      • GCLineWidth:线条宽度
      • GCLineStyle:线条样式
      • GCFont:字体
      • 其他图形属性
  4. values:

    • 一个 XGCValues 结构,包含了你希望更改的具体值。这些值将被应用到指定的图形上下文 gc 中。
    • 只有在 valuemask 中指定的字段会被更新。

XGCValues 结构:
  XGCValues 结构体包含了所有可能的 GC 属性。你可以通过 valuemask 指定需要修改的部分。例如,如果你想要更改 GCForeground 和 GCFillStyle,你需要在 valuemask 中包含相应的位掩码。

示例:

#include <X11/Xlib.h>
#include <X11/Xutil.h>

void changeGC(Display *dpy, GC gc) {
    XGCValues gcv;
    unsigned long valuemask;

    // 设置前景色
    gcv.foreground = BlackPixel(dpy, DefaultScreen(dpy));

    // 设置填充样式为实心
    gcv.fill_style = FillSolid;

    // 设置 valuemask,只修改前景色和填充样式
    valuemask = GCForeground | GCFillStyle;

    // 使用 XChangeGC 更新 GC
    XChangeGC(dpy, gc, valuemask, &gcv);
}

XSetFillRule

  XSetFillRule 是 X11 库中的一个函数,用于设置图形上下文(GC)中的 填充规则。填充规则决定了如何填充复杂路径(如交叉或重叠的多边形)。该规则影响填充区域的计算方式。

int XSetFillRule(Display *display, GC gc, int fill_rule);

参数解释

  1. display:

    • 一个 Display 类型的指针,表示与 X11 服务器的连接。
    • 通常通过 XOpenDisplay() 获得。
  2. gc:

    • 一个 GC(图形上下文)指针,表示需要更改填充规则的图形上下文。
    • 你可以通过 XCreateGC() 创建一个新的图形上下文。
  3. fill_rule:

    • 一个整数值,指定填充规则。它可以是以下两种之一:
      • EvenOddFill(值为 0):偶数-奇数规则。当路径自交时,如果路径内的区域被交点偶数次包围,则该区域不会被填充;如果路径内的区域被交点奇数次包围,则该区域会被填充。
      • WindingFill(值为 1):环绕规则。当路径自交时,如果路径内的区域被路径的绕行数(即围绕次数)为正数,则该区域会被填充。如果绕行数为负数,则不填充。

填充规则说明

  • 偶数-奇数规则(EvenOddFill):

    • 对于任何封闭路径,计算该路径与区域之间的交点数。每次路径经过一个交点时,累加计数。如果交点数为 偶数,该区域不填充;如果交点数为 奇数,该区域填充。
  • 环绕规则(WindingFill):

    • 对于封闭路径,计算路径围绕区域的“绕行”次数。每次路径围绕该区域一圈时,计数加一。只有当围绕次数为正值时,该区域才会被填充;如果围绕次数为负值,则不填充。

XSetGraphicsExposures

XSetGraphicsExposures 是 X11 库中的一个函数,用于设置 图形上下文(GC)图形曝光(Graphics Exposures) 选项。图形曝光用于控制是否在某些操作(如窗口遮挡或更新)后自动生成暴露事件(Expose Events)。

函数原型

int XSetGraphicsExposures(Display *display, GC gc, Bool graphics_exposures);

参数解释

  1. display:

    • 一个指向 Display 结构的指针,表示与 X11 服务器的连接。
    • 通常通过 XOpenDisplay() 获取。
  2. gc:

    • 一个 GC(图形上下文)指针,表示需要更改的图形上下文。
  3. graphics_exposures:

    • 一个布尔值(True 或 False),指定是否启用图形曝光:
      • True:启用图形曝光,表示在图形操作(如绘制或填充)导致的窗口区域暴露时,X11 会自动生成暴露事件。
      • False:禁用图形曝光,表示不会自动生成暴露事件。通常在使用自定义重绘逻辑时使用。

作用和使用场景

  • 图形曝光:图形曝光事件是由 X11 生成的,当窗口部分或全部被遮挡或重新显示时,会触发这些事件。XSetGraphicsExposures 控制图形上下文(GC)是否启用该功能。

    • 启用时,绘图操作可能会引发 Expose 事件,这些事件通常用于在窗口暴露时重新绘制被遮挡的内容。
    • 禁用时,X11 不会自动生成暴露事件,应用程序需要自己管理绘制的时机,尤其是在优化重绘时。
  • 性能优化:禁用图形曝光(False)通常用于优化性能,避免在每次图形绘制时都生成暴露事件。此时,应用程序可能会选择在特定时机(例如,窗口完全显示时)进行绘制操作。

XSetForeground

XSetForeground 是 X11 库中的一个函数,用于设置 图形上下文(GC) 中的 前景色。前景色是用于绘制图形的颜色,比如绘制线条、填充区域或绘制文本时所使用的颜色。

函数原型

void XSetForeground(Display *display, GC gc, unsigned long foreground);

参数解释

  1. display:

    • 一个指向 Display 结构的指针,表示与 X11 服务器的连接。
    • 通常通过 XOpenDisplay() 获取。
  2. gc:

    • 一个指向图形上下文(GC)的指针,表示要设置前景色的图形上下文。
    • 图形上下文(GC)包含了所有绘制操作的属性,如颜色、线条宽度、填充样式等。
  3. foreground:

    • 一个无符号长整型值,表示前景色的像素值。此值通常是通过 XAllocColor() 或 XParseColor() 获取的颜色像素值。

作用
XSetForeground 用于设置图形上下文(GC)的前景色。前景色通常用于图形绘制操作,如:

  • 绘制线条
  • 填充区域
  • 绘制文本等
posted @ 2025-07-24 15:22  卑以自牧lq  阅读(18)  评论(0)    收藏  举报