模式
图案是开罗画的颜料。模式的主要用途是作为所有cairo绘图操作的源代码,尽管它们也可以用作遮罩,即也可以用作画笔。
开罗 模式 是通过使用 PatternType 下面列出的构造函数,或通过 Context.set_source_<type>() 方法。
类模式()
- class cairo.Pattern
模式 是从中派生所有其他模式类的抽象基类。它不能直接实例化。
- get_extend() Extend
- 返回:
当前用于绘制 模式 .
获取的当前扩展模式 模式 . 见
cairo.Extend
有关每个扩展策略语义的详细信息的属性。
- get_filter() Filter
- 返回:
用于调整图案大小的当前筛选器。
在 1.12.0 版本加入: 曾经是一种
SurfacePattern
之前
- set_filter(filter: Filter) None
- 参数:
filter -- 描述用于调整图案大小的过滤器的过滤器。
请注意,即使没有显式的 模式 对象(例如使用
Context.set_source_surface()
)在这些情况下,使用起来很方便Context.get_source()
以访问cairo隐式创建的模式。例如::context.set_source_surface(image, x, y) context.get_source().set_filter(cairo.FILTER_NEAREST)
在 1.12.0 版本加入: 曾经是一种
SurfacePattern
之前
- set_extend(extend: Extend) None
- 参数:
extend -- 一个扩展描述了 模式 将绘制
设置用于在区域外绘制的模式 模式 .
默认的扩展模式是
cairo.Extend.NONE
对于SurfacePattern
和cairo.Extend.PAD
对于Gradient
模式。
- set_matrix(matrix: Matrix) None
- 参数:
matrix -- 一
Matrix
设置 图案 转换矩阵到 矩阵 . 这个矩阵是从用户空间到模式空间的转换。
当A 模式 首先创建它的转换矩阵总是有标识矩阵,这意味着模式空间最初与用户空间相同。
重要提示:请注意,此转换矩阵的方向是从用户空间到模式空间。这意味着如果你想象 模式 到用户空间(和到设备空间),然后该流中的坐标将由 模式 矩阵。
例如,如果要 模式 默认情况下,显示的大小是它的两倍。要使用的正确代码是::
matrix = cairo.Matrix(xx=0.5,yy=0.5) pattern.set_matrix(matrix)
同时,在上述代码中使用2.0而不是0.5的值将导致 模式 以其默认大小的一半显示。
另外,请注意用户空间锁定语义的讨论
Context.set_source
.
- get_dither() Dither
- 返回:
当前的抖动模式。
获取当前抖动模式,由
Pattern.set_dither()
。在 1.25.0 版本加入: 仅适用于开罗1.18.0+
类SolidPattern (Pattern
)
类SurfacePattern (Pattern
)
类渐变 (Pattern
)
- class cairo.Gradient
梯度 是一个抽象基类, 模式 类派生。它不能直接实例化。
- add_color_stop_rgb(offset: float, red: float, green: float, blue: float) None
- 参数:
offset -- 范围内的偏移量 [0.0..一]
red -- 红色成分
green -- 颜色的绿色成分
blue -- 颜色的蓝色成分
向 梯度 模式。偏移指定沿渐变控制向量的位置。例如,a 线性半径 控制向量是从(X0,Y0)到(x1,y1),而 半径半径 控制向量是从起始圆上的任意点到结束圆上的对应点。
颜色的指定方式与
Context.set_source_rgb()
.如果用相同的偏移值指定了两个(或多个)停止,则将根据停止添加的顺序对其进行排序(之前添加的停止将比之后添加的停止进行比较)。这对于可靠地进行锐利的颜色转换(而不是典型的混合)非常有用。
- add_color_stop_rgba(offset: float, red: float, green: float, blue: float, alpha: float) None
- 参数:
offset -- 范围内的偏移量 [0.0..一]
red -- 红色成分
green -- 颜色的绿色成分
blue -- 颜色的蓝色成分
alpha -- 颜色的alpha分量
向 梯度 模式。偏移指定沿渐变控制向量的位置。例如,a 线性半径 控制向量是从(X0,Y0)到(x1,y1),而 半径半径 控制向量是从起始圆上的任意点到结束圆上的对应点。
颜色的指定方式与
Context.set_source_rgb()
.如果用相同的偏移值指定了两个(或多个)停止,则将根据停止添加的顺序对其进行排序(之前添加的停止将比之后添加的停止进行比较)。这对于可靠地进行锐利的颜色转换(而不是典型的混合)非常有用。
类线性半径 (Gradient
)
- class cairo.LinearGradient(x0: float, y0: float, x1: float, y1: float)
- __init__(x0: float, y0: float, x1: float, y1: float) None
- 参数:
x0 -- 起点X坐标
y0 -- 起点Y坐标
x1 -- 终点X坐标
y1 -- 终点Y坐标
创建新的 LinearGradient 沿(x0,y0)和(x1,y1)定义的线。在使用之前 梯度 图案,应使用
Gradient.add_color_stop_rgb()
或Gradient.add_color_stop_rgba()
注意:这里的坐标在模式空间中。为了一个新的 模式 ,模式空间与用户空间相同,但可以使用
Pattern.set_matrix()
类半径 (Gradient
)
- class cairo.RadialGradient(cx0: float, cy0: float, radius0: float, cx1: float, cy1: float, radius1: float)
- __init__(cx0: float, cy0: float, radius0: float, cx1: float, cy1: float, radius1: float) None
- 参数:
cx0 -- 起始圆中心的X坐标
cy0 -- 起点圆中心的Y坐标
radius0 -- 起始圆半径
cx1 -- 终点圆中心的X坐标
cy1 -- 终点圆中心的Y坐标
radius1 -- 端圆半径
创建新的 RadialGradient 由(cx0,cy0,radius0)和(cx1,cy1,radius1)定义的两个圆之间的图案。在使用渐变图案之前,应使用
Gradient.add_color_stop_rgb()
或Gradient.add_color_stop_rgba()
.注意:这里的坐标在模式空间中。对于新模式,模式空间与用户空间相同,但可以使用
Pattern.set_matrix()
.
类网格模式 (Pattern
)
- class cairo.MeshPattern
网格模式是张量积面片网格(PDF中的类型7阴影)。网格图案也可用于创建其他类型的着色,这些着色是张量产品面片网格的特殊情况,例如Coons面片网格(PDF中的类型6着色)和Gouraud着色三角形网格(PDF中的类型4和5着色)。
网格图案由一个或多个张量积片组成,在使用网格图案之前应先定义这些张量积片。使用带有部分定义的修补程序的网格模式作为源或遮罩将使上下文处于状态为的错误状态。
cairo.Status.INVALID_MESH_CONSTRUCTION
.张量积补丁由4条b_zier曲线(0、1、2、3边)和4个额外的控制点(p0、p1、p2、p3)定义,这些控制点提供对补丁的进一步控制并完成张量积补丁的定义。角c0是补丁的第一个点。
允许使用退化边,因此可以使用直线。一侧的零长度线可用于创建三面面片。
C1 Side 1 C2 +---------------+ | | | P1 P2 | | | Side 0 | | Side 2 | | | | | P0 P3 | | | +---------------+ C0 Side 3 C3
每个补丁都是通过第一次调用构建的
begin_patch()
然后move_to()
指定补丁中的第一个点(c0)。然后通过调用指定边curve_to()
和line_to()
.一个补丁中的四个附加控制点(p0、p1、p2、p3)可以用指定
set_control_point()
.在补片的每个角(c0、c1、c2、c3),颜色可指定为
set_corner_color_rgb()
或set_corner_color_rgba()
. 未显式指定颜色的任何角都默认为透明黑色。Coons补丁是张量积补丁的一种特殊情况,其中控制点由补丁的边隐式定义。未指定的任何控制点的默认值是coons修补程序的隐式值,即,如果未指定控制点,则修补程序是coons修补程序。
三角形是张量积面片的一种特殊情况,其中控制点由面片的边隐式定义,所有边都是线,其中一个长度为0,即如果面片只用3条线指定,则它是三角形。如果由0长度边连接的角具有相同的颜色,则补片为Gouraud着色三角形。
补丁的方向可能与上图不同。例如,第一个点可能在左上角。图中只显示了边、角和控制点之间的关系。无论第一个点位于何处,指定颜色时,角0始终是第一个点,角1是边0和边1之间的点等。
调用
end_patch()
完成当前修补程序。如果定义的边小于4,则第一个缺失边定义为从当前点到补片的第一个点(c0)的一条线,其他边定义为从c0到c0的退化线。添加的边之间的角都将与补片的c0一致,并且它们的颜色将设置为与c0的颜色相同。附加补丁可以通过附加调用添加到
begin_patch()
/end_patch()
.# Add a Coons patch pattern = cairo.MeshPattern() pattern.begin_patch() pattern.move_to(0, 0) pattern.curve_to(30, -30, 60, 30, 100, 0) pattern.curve_to(60, 30, 130, 60, 100, 100) pattern.curve_to(60, 70, 30, 130, 0, 100) pattern.curve_to(30, 70, -30, 30, 0, 0) pattern.set_corner_color_rgb(0, 1, 0, 0) pattern.set_corner_color_rgb(1, 0, 1, 0) pattern.set_corner_color_rgb(2, 0, 0, 1) pattern.set_corner_color_rgb(3, 1, 1, 0) pattern.end_patch() # Add a Gouraud-shaded triangle pattern = cairo.MeshPattern() pattern.begin_patch() pattern.move_to(100, 100) pattern.line_to(130, 130) pattern.line_to(130, 70) pattern.set_corner_color_rgb(0, 1, 0, 0) pattern.set_corner_color_rgb(1, 0, 1, 0) pattern.set_corner_color_rgb(2, 0, 0, 1) pattern.end_patch()
当两个面片重叠时,最后一个添加的面片将绘制在第一个面片上。
当面片自身折叠时,根据面片内的参数坐标对点进行排序。当从3侧移动到1侧时,V坐标范围为0到1;当从0侧移动到1侧时,U坐标范围为0到1
具有较高V坐标的点隐藏具有较低V坐标的点。当两个点具有相同的V坐标时,U坐标较高的点位于上方。这意味着靠近侧边1的点高于靠近侧边3的点;如果这不足以决定哪个点高于侧边(例如,当两个点都属于侧边1或侧边3时),则靠近侧边2的点高于靠近侧边0的点。
有关张量积补丁的完整定义,请参阅PDF规范(ISO32000),该规范详细描述了参数化。
注意:坐标总是在图案空间中。对于新模式,模式空间与用户空间相同,但可以使用
Pattern.set_matrix()
.在 1.14 版本加入.
- begin_patch() None
- 抛出:
Error --
以网格模式开始修补。
调用此函数后,应使用
move_to()
,line_to()
和curve_to()
.定义补丁之后,
end_patch()
必须在将模式用作源或掩码之前调用。
- curve_to(x1: float, y1: float, x2: float, y2: float, x3: float, y3: float) None
- 参数:
x1 -- 第一个控制点的X坐标
y1 -- 第一个控制点的Y坐标
x2 -- 第二控制点的X坐标
y2 -- 第二控制点的Y坐标
x3 -- 曲线末端的X坐标
y3 -- 曲线末端的Y坐标
- 抛出:
Error --
使用(x1,y1)和(x2,y2)作为控制点,将一个三次B_zier样条曲线添加到模式空间坐标中从当前点到位置(x3,y3)的当前面片。
如果当前修补程序在调用之前没有当前点
curve_to()
,此函数的行为将类似于前面有一个对pattern.move_to(x1, y1)
.在此调用之后,当前点将是(x3,y3)。
- get_control_point(patch_num: int, point_num: int) Tuple[float, float]
- 参数:
patch_num -- 返回数据的修补程序号
point_num -- 返回数据的控制点编号
- 返回:
浮点(x,y)元组-控制点坐标
- 抛出:
Error --
获取网格图案的修补程序的控制点编号。
patch_num
可以从0到n-1,其中n是返回的数字get_patch_count()
.的有效值
point_num
从0到3,并按照中的说明识别控制点。MeshPattern
.
- get_corner_color_rgba(patch_num: int, corner_num: int) Tuple[float, float, float, float]
- 参数:
patch_num -- 返回数据的修补程序号
corner_num -- 返回数据的角点编号
- 返回:
(红、绿、蓝、阿尔法)浮点数
- 抛出:
Error --
获取角部的颜色信息
corner_num
第页,共页patch_num
对于网格图案。patch_num
可以从0到n-1,其中n是返回的数字get_patch_count()
.的有效值
corner_num
从0到3,并按中的说明标识角MeshPattern
.
- get_patch_count() int
- 返回:
补丁数量
获取在给定网格图案中指定的修补程序数。
号码只包括通过调用
end_patch()
. 例如,在定义第一个补丁的过程中,它将是0。
- line_to(x: float, y: float) None
- 参数:
x -- 新行末尾的X坐标
y -- 新行末尾的Y坐标
- 抛出:
Error --
在图案空间坐标中,从当前点到位置(x,y)向当前面片添加一条线。
如果调用之前没有当前点
line_to()
此函数将表现为pattern.move_to(x ,y)
.在这个调用之后,当前点将是(x,y)。
- move_to(x: float, y: float) None
- 参数:
x -- 新位置的X坐标
y -- 新位置的Y坐标
- 抛出:
Error --
定义网格图案中当前面片的第一个点。
在这个调用之后,当前点将是(x,y)。
- set_control_point(point_num: int, x: float, y: float) None
- 参数:
point_num -- 要为其设置位置的控制点
x -- 控制点的X坐标
y -- 控制点的Y坐标
- 抛出:
Error --
设置当前补丁的内部控制点。
点编号的有效值为0到3,并按照中的说明标识控制点。
MeshPattern
.
- set_corner_color_rgb(corner_num: int, red: float, green: float, blue: float) None
- 参数:
corner_num -- 为其设置颜色的角点
red -- 红色成分
green -- 颜色的绿色成分
blue -- 颜色的蓝色成分
- 抛出:
Error --
设置网格图案中当前面片角的颜色。
颜色的指定方式与
Context.set_source_rgb()
.角点编号的有效值为0到3,并按照中的说明标识角点。
MeshPattern
.
- set_corner_color_rgba(corner_num: int, red: float, green: float, blue: float, alpha: float) None
- 参数:
corner_num -- 为其设置颜色的角点
red -- 红色成分
green -- 颜色的绿色成分
blue -- 颜色的蓝色成分
alpha -- 颜色的alpha分量
- 抛出:
Error --
设置网格图案中当前面片角的颜色。
颜色的指定方式与
Context.set_source_rgba()
.角点编号的有效值为0到3,并按照中的说明标识角点。
MeshPattern
.
- get_path(patch_num: int) Path
- 参数:
patch_num -- 返回数据的修补程序号
- 返回:
定义修补程序的路径
- 抛出:
Error --
获取定义修补程序的路径
patch_num
对于网格图案。patch_num
可以从0到n-1,其中n是返回的数字get_patch_count()
.
类RasterSourcePattern (Pattern
)
- class cairo.RasterSourcePattern(content: Content, width: int, height: int)
栅格源提供了在渲染时提供任意像素数据的能力。像素在栅格化时通过用户回调函数进行查询,从而实现最大的灵活性。例如,在处理压缩图像源时,您可以保留一个已解压缩图像的MRU缓存,并动态地解压缩源,并丢弃旧的源以节省内存。
为了使栅格源有效,您必须至少指定获取和释放回调,用于检索感兴趣区域的像素数据,并在以后可以释放时取消标记。当图案在栅格化过程中被临时复制,或者更永久地作为快照复制时,为了保持像素数据可供打印,还提供了其他回调。
在 1.15 版本加入.
- __init__(content: Content, width: int, height: int) None
- 参数:
content -- 将返回的像素数据的内容类型。提前知道内容类型用于分析操作并选择适当的渲染路径。
width -- 样品区的最大尺寸
height -- 样品区的最大尺寸
创建用于提供像素数据的新用户模式。
使用setter函数将回调与返回的模式关联起来。
在 1.15 版本加入.
- set_acquire(acquire: Callable[[Surface, RectangleInt], Surface] | None, release: Callable[[Surface], None] | None) None
-
指定用于为渲染操作(Acquire)生成图像曲面的回调,以及用于随后清理该曲面的函数。
Acquire回调应该创建一个表面(最好创建一个与目标匹配的图像表面,使用
Surface.create_similar_image()
)它至少定义了由扩展数据块指定的感兴趣的区域。表面可以是整个样品区,但如果它确实包含样品区的一部分,则应通过使用Surface.set_device_offset()
.- acquire(target, extents)
- 参数:
target (Surface) -- 渲染目标曲面
extents (RectangleInt) -- 样本空间像素中感兴趣的矩形区域
- 返回类型:
当从呈现模式时,将调用此函数。它应该创建一个曲面,为感兴趣的区域提供由范围定义的像素数据,尽管曲面本身不必局限于该区域。为了方便起见,表面应该是图像类型,用
Surface.create_similar_image()
对于目标(允许在传输到设备期间减少副本数)。另一个选项,可能是返回一个与目标类似的表面,以便通过设备上一组缓存源的应用程序进行显式处理。提供的样本数据区域应使用Surface.set_device_offset()
指定采样数据的左上角(以及曲面的宽度和高度)。
在 1.15 版本加入.