R 开发版本(将成为 4.2.0 版本)中的 R 图形引擎添加了许多新图形功能
组、合成运算符、仿射变换、描边和填充路径以及亮度蒙版。这会影响提供图形设备的 R 软件包,例如“ragg”软件包。
对于提供图形设备的 R 软件包用户,在更新到 R 4.2.0 时需要重新安装这些软件包。
对于提供图形设备的 R 软件包的维护者,本文档描述了为 R 4.2.0 做准备而更新图形设备软件包时必要的更改。
R 用户只需要知道重新安装图形设备软件包即可;本文档的其余部分更具技术性,面向维护图形设备软件包的 R 开发人员。
选项 1
第一个选项很简单:什么都不做。
随着图形设备的deviceVersion
的添加,图形引擎能够检测到图形设备尚未更新,并且不会要求设备执行其不支持的操作。
唯一可能出现的问题是,如果未重新安装图形设备软件包,并且软件包使用R_GE_checkVersionOrDie()
,则软件包将失败并显示“版本不匹配”错误。在这种情况下,解决方案是重新安装图形设备。
选项 2
第二个选项也相对简单:几乎什么都不做。
此选项涉及更新图形设备软件包,将deviceVersion
设置为 15(R_GE_group
),但无需提供对任何新功能的支持。
新的图形引擎版本要求图形设备提供以下新的设备回调
defineGroup()
useGroup()
releaseGroup()
stroke()
fill()
fillStroke()
capabilities()
在每种情况下,都可以提供不执行任何操作的存根。图形引擎将调用设备,但不会产生任何输出。
postscript()
图形设备为此方法提供了一个模板。图形设备软件包可以根据devPS.c
中的PS_defineGroup()
等函数对设备回调进行建模。
此选项的一个更雄心勃勃的变体是仅提供对部分新功能的支持;这也是下一个选项的一个不太雄心勃勃的变体…
选项 3
此选项更难:添加对新功能的支持。
对于某些图形设备,这将不是一种选择,因为图形设备底层的语言或库不支持新功能。xfig()
设备就是一个示例。
在可以添加支持的地方,每个新设备回调的目的是(简要地)
defineGroup(source, op, destination)
应运行 R 函数destination
,设置合成运算符op
,然后运行 R 函数source
,记录由此产生的所有绘制,并返回对记录的绘制的引用。useGroup(ref, trans)
应应用变换矩阵trans
并渲染由ref
引用的记录的绘制。releaseGroup(ref)
可以释放与由ref
引用的记录的绘制关联的资源。stroke(path)
应运行 R 函数path
,将所有绘制记录为路径,然后描边路径。fill(path, rule)
应运行 R 函数path
,将所有绘制记录为路径,然后使用填充rule
填充路径。fillStroke(path, rule)
应运行 R 函数path
,将所有绘制记录为路径,然后使用填充rule
填充并描边路径。capabilities(capabilities)
应修改列表capabilities
的组件,以指示设备提供的支持级别。
pdf()
设备和基于 Cairo 图形库的设备(例如 png(type="cairo")
和 svg()
)提供了已实现对新功能的支持的设备示例。例如,请参阅 devPS.c
中的 PDF_defineGroup()
和 cairoFns.c
中的 Cairo_DefineGroup()
。
“R Internals” 手册的 “图形设备” 部分 也包含一些更详细的信息,特别是关于 capabilities()
设备回调。
可以在一系列技术报告中找到关于新功能及其实现方式的进一步讨论和更多详细信息:一份关于 组,一份关于 路径,一份关于 蒙版。