广色域颜色¶
在 0.50.0 版本加入.
终端颜色采用 sRGB。近年来多数显示器能显示超出该色域的颜色,例如 Display P3 更深的红绿,以及范围更大的 Rec. 2020,但程序原本无法请求这些颜色。本扩展使用现有转义序列中已预留的位置,让程序声明 RGB 颜色所属色域,不影响未使用它的程序。
选择色域¶
RGB 颜色 SGR 的冒号形式,在 2 和红色分量之间有一个可选色彩空间 ID。它由 ITU-T T.416 定义,但终端此前未赋予含义,只是跳过。本扩展为它定义如下含义::
<ESC>[38:2:<id>:<r>:<g>:<b>m foreground
<ESC>[48:2:<id>:<r>:<g>:<b>m background
id 为 0 表示 sRGB,与省略相同;1 表示 Display P3,2 表示 Rec. 2020。其他 ID 按 0 处理。分量范围 0 至 255,在所有色域中都用 sRGB 传递曲线编码,因此 ID 只改变基色,终端只需要一种曲线。最亮的 Display P3 红色为::
<ESC>[38:2:1:255:0:0m
色域属于与其一同指定的 RGB 颜色。选择十六种基本色、256 色调色板颜色、默认色,或不带 ID 的 RGB 色时,也会选择 sRGB。反显时色域跟随颜色,因此前景为 Display P3 的反显单元会显示 Display P3 背景。下划线和删除线等装饰使用前景及其色域,除非通过 58 设置装饰色,后者始终为 sRGB。
不认识 ID 的终端会跳过它,因此程序可无条件发送,在其他终端上将相同分量解释为 sRGB,饱和度稍低但不会产生错误。ID 仅在冒号形式中识别。分号形式 <ESC>[38;2;<r>;<g>;<b>m 没有 ID,因为随后的参数属于无关属性。
图像¶
通过 终端图形协议 发送的图像像素默认也为 sRGB。传输命令的 G 键可使用与文本相同的 ID 声明其他色域::
<ESC>_Gf=24,s=10,v=20,G=1;<payload><ESC>\
G=1 为 Display P3,G=2 为 Rec. 2020;G=0、其他值或省略键均为 sRGB。与文本一样,全部色域分量都用 sRGB 传递曲线编码。该键适用于 RGB 和 RGBA 数据(f=24 和 f=32),分块传输时应位于首块。它同样适用于 GPU 表面 t=g 的像素。f=64 忽略该键,因为按定义它是线性扩展 sRGB,见 HDR 亮度协议。矢量图像 f=200 也忽略 G:每种绘制色在 矢量图像 中各自指定色彩空间。矢量文本、路径、渐变和内嵌图像共用线性扩展 sRGB 合成器,裁剪与混合过程会保留广色域和 HDR 值。
PNG 图像 f=100 自行描述颜色,因此忽略此键。当内嵌配置文件的基色属于 Display P3 或 Rec. 2020 时(无论其曲线如何),或 cICP 块指定这些基色与 sRGB 传递函数时,PNG 就属于相应色域。其他 PNG 按以往方式处理为 sRGB,带配置文件时先转换到 sRGB。
动画图像的所有帧都属于图像创建数据的色域。以其他色域传输的帧会在加载时转换到图像色域,因此程序可按每帧现有色域直接发送。
与文本颜色 ID 不同,不认识该键的终端可能不会跳过它,而是拒绝整条命令且不回复。因此程序应先使用图形协议查询操作,附带单个像素::
<ESC>_Gi=31,a=q,f=24,s=1,v=1,G=1;AAAA<ESC>\
只向回答 OK 的终端发送此键。
终端如何处理色域¶
终端通过 CIE XYZ 将标注色域的颜色转换到绘制色域,并裁剪显示器无法显示的颜色。没有 ID 的颜色仍按原来的终端自身色彩空间处理,不做修改,因此不使用 ID 的程序与扩展出现前完全相同。终端在 sRGB 中绘制时,Display P3 或 Rec. 2020 色会显示为最接近的 sRGB 色,这与直接按 sRGB 解读分量接近但不完全相同。只有终端在更宽色域中绘制时,额外颜色才会显现。标注色域的图像采用相同转换,未标注图像保持原有行为。
程序若要判断请求广色域是否值得,可在支持显示信息协议的终端中,通过 display 查询显示器的 gamut;否则可直接发送文本颜色 ID。高于 SDR 白色的亮度属于独立属性,即 HDR 亮度协议的 56 和 57,两者可以组合:两倍 SDR 白色亮度的 Display P3 红色为 <ESC>[38:2:1:255:0:0m<ESC>[56:200m。
Silkie 中的实现¶
在 Silkie 中,色域与单元颜色一起保存,随颜色保留于回滚、带格式复制及当前 SGR 状态的 DECRQSS 报告中;ID 非 0 时报告包含该 ID。macOS 窗口在 macos_colorspace 选择的色彩空间中绘制,已标注颜色转换到该空间:srgb 会将 Display P3 和 Rec. 2020 裁剪到 sRGB;displayp3 原样显示 Display P3,将 Rec. 2020 裁剪到 Display P3,而未标注颜色仍按此选项一贯的方式解释为 Display P3。default 使用显示器原生色彩空间,全部颜色不经转换直接传递。
在 Wayland 上,窗口默认使用 sRGB,除非 wayland_colorspace 请求 displayp3、rec2020 或 auto,且合成器实现 color-management-v1 色彩管理协议。此时向合成器声明窗口所属色域,标注颜色和图像均转换到该色域:在 displayp3 窗口中,Display P3 原样显示,Rec. 2020 裁剪到 Display P3。与 macOS 不同,未标注颜色仍为 sRGB,也会转换到窗口色域,所以未请求广色域的内容与 sRGB 窗口外观相同。auto 依据合成器报告,在三种色域中选择显示器基色能够覆盖的最宽者。重新加载配置时,此选项对已有窗口生效。
向合成器声明窗口的色域基色和 2.2 伽马;终端颜色原本面向这种显示特性,合成器也按此理解未作声明的窗口。因此,广色域窗口与 sRGB 窗口的灰度数值相同。基色转换在 sRGB 曲线的线性光空间中进行,与 Silkie 的全部混合一致,可能使未标注的饱和色相对于 sRGB 窗口在 255 级中偏移一级。若合成器不提供 2.2 伽马,则改为声明 sRGB 曲线。在无此协议的合成器及 X11 上,窗口使用 sRGB。
同时显示 HDR 的窗口(见 hdr 和 HDR 亮度协议)与其他窗口一样只有一份描述,同时包含此处选择的基色、代替伽马的线性值,以及内容达到的亮度。颜色按上述方式转换到窗口色域,高于 SDR 白色的亮度在该色域中仍被保留。如果合成器不接受广色域基色的线性值,窗口保留 HDR,改用 sRGB;如果完全不能显示 HDR,则按上文描述作为广色域窗口。
若 PNG 配置文件的三种基色,分别在 x 和 y 上与 Display P3 或 Rec. 2020 对应基色相差不超过 0.005(双方均适应配置文件使用的 D50 白点),则认定为该色域。像素仅从配置文件曲线转换到 sRGB 曲线,不做其他变换。Silkie 中背景图、窗口标志等其他 PNG 用途仍按以往方式使用 sRGB。