节点文件格式 [src]

GSK 渲染节点可以使用诸如 gsk_render_node_serialize()gsk_render_node_deserialize() 等 API 序列号化和反序列号化。使用此功能的目的是进行开发,主要用于 GTK 的开发,方法是创建测试套件和基准测试、在错误报告中交换节点等。 GTK 包含 gtk4-node-editor 应用程序,用于创建此类测试文件。

该格式是一种文本格式,遵循 CSS 语法规则。具体而言,这意味着当解析时,每个字节数组都将生成一个渲染节点,因为有一个定义的错误恢复方法。有关错误处理的更多详细信息,请参阅解析 API 的文档。

使用 CSS 值定义语法的 节点文本表示法的语法如下所示

document: <@-rule>*<node>
@-rule: `cicp` "name" { <property>* }
node: container [ "name" ] { <document> } | <node-type> [ "name" ] { <property>* } | "name"
property: <property-name>: <node> | <value> ;

每个节点有其自己的 <node-type>,并支持自定义属性集,每个属性集有其自己的 <property-name> 和语法。以下段落记录了每个节点及其属性。

序列号化时,如果属性值等于默认值,则不会序列号化此值。序列号化的目的是尽可能生成更小的输出。

要在字符串中嵌入换行符,请使用 \A。要将一个长字符串拆分为多行,请使用转义符 . 来转义新行。

名称

节点

可以通过在其定义中 <node-type> 后面添加字符串来给节点一个名称。可以在文档的稍后部分使用仅指定标识节点的名称来使用该节点。

纹理

就像节点一样,可以通过名称引用纹理。定义已命名纹理时,名称必须放在 URL 之前。

颜色状态

颜色状态由一个标识符(用于内置标识符)或一个字符串(用于自定义标识符)表示。

color-state: <ident> | <string>

可以使用 @‌cicp 规则在文档开头定义自定义颜色状态。

@‌cicp 规则的格式为:

@‌cicp "name" {
  ...
}

可以为自定义颜色状态设置以下属性:

属性 语法 默认值 已打印
原色 <整数> 2 始终
传输 <整数> 2 始终
矩阵 <整数> 2 始终
范围 <范围> 完全 非默认值

请注意,始终需要指定原色、传输和矩阵属性,因为 GTK 不允许创建已将这些属性设置为 2(==未指定)的颜色状态对象。

范围可以具有以下值:

range: narrow | full

颜色

可以使用 CSS 颜色语法的变体来指定颜色:

color(<color-state> <number> <number> <number> ["/" <number>])

用于 sRGB 颜色的传统语法仍然有效:

rgba(<number>, <number>, <number>, <number)
rgb(<number, <number>, <number>)

矩形

可以通过四个整数(x、y、宽和高)来指定矩形

rect: <number> <number> <number> <number>

圆角矩形使用类似 CSS 的语法:

rounded-rect: <rect> [ "/" <number>{1,4} [ "/" <number>{1,4} ] ]

节点

容器

container 节点是一个特殊节点,它允许指定子节点列表。其内容遵循与空文档相同的规则。

混合

属性 语法 默认值 已打印
底部 <node> 颜色 { } 始终
模式 <混合模式> 正常 非默认值
顶部 <node> 颜色 { } 始终

使用指定属性创建类似于 gsk_blend_node_new() 的节点。

模式属性的值可能为

blend-mode: normal | multiply | screen | overlay | darken |
            lighten | color-dodge | color-burn | hard-light |
            soft-light | difference | exclusion | color |
            hue | saturation | luminosity

模糊

属性 语法 默认值 已打印
模糊 <数字> 1 非默认值
子级 <node> 颜色 { } 始终

使用指定属性创建类似于 gsk_blur_node_new() 的节点。

边框

属性 语法 默认值 已打印
颜色 <颜色>{1,4} 黑色 非默认值
轮廓 <圆角矩形> 50 始终
宽度 <数字>{1,4} 1 非默认值

使用指定属性创建类似于 gsk_border_node_new() 的节点。

关于颜色和宽度属性,这些值遵循典型的 CSS 顺序:顶部、右侧、底部、左侧。如果未给出最后一个/左侧的值,则使用第二个/右侧的值。如果未给出第三个/底部的值,则使用第一个/顶部的值。并且如果未给出第二个/右侧的值,则对每 4 个值使用第一个/顶部的值。

开罗

属性 语法 默认值 已打印
边界 <矩形> 始终
像素 <url> 非默认值
脚本 <url> 非默认值

像素是 png 数据的 base64 编码数据 url。脚本是开罗脚本的 base64 编码数据 url。

剪辑

属性 语法 默认值 已打印
子级 <node> 颜色 { } 始终
剪辑 <圆角矩形> 50 始终

使用指定属性创建类似于 gsk_clip_node_new() 的节点。

作为扩展,此节点允许为剪辑属性指定圆角矩形。如果该矩形确实是圆形的,则将创建类似于 gsk_rounded_clip_node_new() 的节点。

颜色

属性 语法 默认值 已打印
边界 <矩形> 50 始终
颜色 <颜色> FF00CC 始终

使用指定属性创建类似于 gsk_color_node_new() 的节点。

此颜色选择为错误粉红色,以便使其可见,同时提醒人们更改。

颜色矩阵

属性 语法 默认值 已打印
子级 <node> 颜色 { } 始终
矩阵 <转换> 非默认值
偏移量 <数字>{4} 0 0 0 0 非默认值

使用指定属性创建类似于 gsk_color_matrix_node_new() 的节点。

矩阵属性接受一个出于兼容性目的,但您应该知道,允许的值用于 3D 转换,因此它们的命名可能看起来很别扭。但是,始终可以使用 matrix3d() 制作来单独指定所有 16 个值。

圆锥梯度

属性 语法 默认值 已打印
边界 <矩形> 50 始终
中心 <点> 25, 25 始终
旋转 <数字> 0 始终
停止 <颜色停止> 0 AF0,1 F0C 始终
插值 <颜色状态> srgb 非默认值
色调插值 <色调内插> 较短 非默认值

使用指定属性创建类似于 gsk_conic_gradient_node_new() 的节点。

色调插值属性的值可能为

hue-interpolation: shorter | longer | increasing | decreasing

交叉淡化

属性 语法 默认值 已打印
结束 <node> 颜色 { } 始终
进度 <数字> 0.5 非默认值
开始 <node> 颜色 { } 始终

使用指定属性创建类似于 gsk_cross_fade_node_new() 的节点。

调试

属性 语法 默认值 已打印
子级 <node> 颜色 { } 始终
信息 <字符串> “” 非默认值

使用指定属性创建类似于 gsk_debug_node_new() 的节点。

填充

属性 语法 默认值 已打印
子级 <node> 见下方 始终
路径 <字符串> “” 始终
填充规则 <填充规则> 绕线 始终

使用给定属性创建一个节点,如 gsk_fill_node_new()

默认子节点为默认颜色节点,但它是由路径边界创建的。

填充规则属性的可能值为

fill-rule: winding | even-odd

glshader

属性 语法 默认值 已打印
边界 <矩形> 50 始终
源代码 <字符串> “” 始终
参数 <uniform 值> 非默认值
child1 <node> 非默认值
child2 <node> 非默认值
child3 <node> 非默认值
child4 <node> 非默认值

创建一个 GLShader 节点。sourcecode 必须是 GLSL 片段着色器。args 必须与该着色器中声明的简单类型的 uniforms 相匹配,且按顺序用逗号分隔。child 属性必须与着色器中的采样器 uniforms 相匹配。

inset-shadow

属性 语法 默认值 已打印
模糊 <数字> 0 非默认值
颜色 <颜色> 黑色 非默认值
dx <数字> 1 非默认值
dy <数字> 1 非默认值
轮廓 <圆角矩形> 50 始终
spread <数字> 0 非默认值

使用给定属性创建一个节点,如 gsk_inset_shadow_node_new()

linear-gradient

属性 语法 默认值 已打印
边界 <矩形> 50 始终
开始 <点> 0 0 始终
结束 <点> 0 50 始终
停止 <颜色停止> 0 AF0,1 F0C 始终
插值 <颜色状态> srgb 非默认值
色调插值 <色调内插> 较短 非默认值

使用给定属性创建一个节点,如 gsk_linear_gradient_node_new()

mask

属性 语法 默认值 已打印
source <node> 颜色 { } 始终
模式 <mask-mode> alpha 非默认值
mask <node> 颜色 { } 始终

创建一个节点,如 gsk_mask_node_new(),并使用给定的属性。

模式属性的值可能为

mask-mode: alpha | inverted-alpha | luminance | inverted-luminance

opacity

属性 语法 默认值 已打印
子级 <node> 颜色 { } 始终
opacity <数字> 0.5 非默认值

使用给定属性创建一个节点,如 gsk_transform_node_new()

outset-shadow

属性 语法 默认值 已打印
模糊 <数字> 0 非默认值
颜色 <颜色> 黑色 非默认值
dx <数字> 1 非默认值
dy <数字> 1 非默认值
轮廓 <圆角矩形> 50 始终
spread <数字> 0 非默认值

使用给定属性创建一个节点,如 gsk_outset_shadow_node_new()

radial-gradient

属性 语法 默认值 已打印
边界 <矩形> 50 始终
中心 <点> 25 25 始终
hradius <数字> 25 始终
vradius <数字> 25 始终
开始 <数字> 0 始终
结束 <数字> 1 始终
停止 <颜色停止> 0 AF0,1 F0C 始终
插值 <颜色状态> srgb 非默认值
色调插值 <色调内插> 较短 非默认值

使用给定属性创建一个节点,如 gsk_radial_gradient_node_new()

repeat

属性 语法 默认值 已打印
边界 <矩形> 子节点的边界 非默认值
子级 <node> 颜色 { } 始终
child-bounds <矩形> 子节点的边界 非默认值

使用给定属性创建一个节点,如 gsk_repeat_node_new()

repeating-linear-gradient

属性 语法 默认值 已打印
边界 <矩形> 50 始终
开始 <点> 0 0 始终
结束 <点> 0 50 始终
停止 <颜色停止> 0 AF0,1 F0C 始终

使用给定属性创建一个节点,如 gsk_repeating_linear_gradient_node_new()

repeating radial-gradient

属性 语法 默认值 已打印
边界 <矩形> 50 始终
中心 <点> 25 25 始终
hradius <数字> 25 始终
vradius <数字> 25 始终
开始 <数字> 0 始终
结束 <数字> 1 始终
停止 <颜色停止> 0 AF0,1 F0C 始终

使用给定属性创建一个节点,如 gsk_repeating_radial_gradient_node_new()

rounded-clip

属性 语法 默认值 已打印
子级 <node> 颜色 { } 始终
剪辑 <圆角矩形> 50 始终

使用给定属性创建一个节点,如 gsk_rounded_clip_node_new()

shadow

属性 语法 默认值 已打印
子级 <node> 颜色 { } 始终
shadows <shadow> black 1 1 始终

使用给定属性创建一个节点,如 gsk_shadow_node_new()

stroke

属性 语法 默认值 已打印
子级 <node> 见下方 始终
路径 <字符串> “” 始终
line-width <数字> 0 非默认值
line-cap <line-cap> butt 始终
line-join <line-join> miter 始终
miter-limit <数字> 4 非默认值
dash <number>{+}|none 非默认值
dash-offset <数字> 0 非默认值

使用给定属性创建一个节点,如 gsk_stroke_node_new()

默认子节点为默认颜色节点,但它是由路径的描边边界创建的。

line-cap 属性的可能值为

line-cap: butt | round | square

line-join 属性的可能值为

line-join: miter | round | bevel

text

属性 语法 默认值 已打印
颜色 <颜色> 黑色 非默认值
font <string> <url>? “Cantarell 15px” 始终
glyphs <glyphs> “Hello” 始终
偏移量 <点> 0 0 非默认值
hint-style <hint-style> slight 非默认值
antialias <antialias> gray 非默认值
hint-metrics <hint-metrics> off 非默认值

使用给定属性创建一个节点,如 gsk_text_node_new()

如果为字体指定了一个 url,它必须指向字符串中指定的字体的字体文件。它可以包含一个 base64 编码字体文件的数据 url,或者指向一个字体文件的常规 url。

字形可以指定为 ASCII 字符串或逗号分隔的字形 ID 列表。此外,还可以指定前进宽度、X 和 Y 偏移量和标志,如下所示:40 10 0 0 颜色。

如果指定的字体不存在或给定字体中的指定字形无效,将返回一个错误节点。

提示样式属性的可能值是

hint-style: none | slight | full

抗锯齿属性的可能值是

antialias:  none | gray

提示度量的可能值是

hint-metrics:  on | off

纹理

属性 语法 默认值 已打印
边界 <矩形> 50 始终
纹理 <字符串>?<网址>? 见下方 始终

使用给定的属性创建一个类似于 gsk_texture_node_new() 的节点。

如果为纹理指定了一个字符串,它将用作文本的名称。可以通过指定先前使用的纹理的名称来复用纹理。在那种情况下,可以省略网址。

默认纹理是一个 10x10 的棋盘格,左上和右下 5x5 的部分为颜色 FF00CC,其他部分为透明。此纹理的一个可能表示形式为 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABmJLR0QA/wD/AP+gvaeTAAAAKUlEQVQYlWP8z3DmPwMaYGQwYUQXY0IXwAUGUCGGoxkYGBiweXAoeAYAz44F3e3U1xUAAAAASUVORK5CYII=")

纹理比例

属性 语法 默认值 已打印
边界 <矩形> 50 始终
纹理 <url> 见下方 始终
滤镜 滤镜 线性 非默认值

使用给定的属性创建一个类似于 gsk_texture_scale_node_new() 的节点。

默认纹理是一个 10x10 的棋盘格,就像对于纹理。一样。

滤镜属性的可能值是

filter: linear | nearest | trilinear

转换

属性 语法 默认值 已打印
子级 <node> 颜色 { } 始终
转换 <转换> 非默认值

使用给定属性创建一个节点,如 gsk_transform_node_new()