---
title: "Improvements to Clipping in the R Graphics Engine"
author: "Paul Murrell"
date: 2020-06-08
categories: ["Internals"]
tags: ["graphics"]
---
**UPDATE (2020-11-18): canClip = NA_LOGICAL has been replaced by
deviceClip = TRUE**
The R graphics engine performs some clipping of output regardless of
whether the graphics device it is sending output to can perform
clipping itself. For example, output that is sent to the
`postscript()` device, which can do its own clipping, is still
clipped by the graphics engine to the edges of the device.
This is useful for devices that cannot clip, e.g., the `xfig()` device,
and was historically useful as protection against very large values
being sent to a device. The latter case used to be relevant when PostScript
was a very important format and the `ghostview` viewer for PostScript
files could not handle very large values.
Unfortunately, the clipping that the graphics engine performs can introduce
artifacts. For example, if we draw a very thick line, with a square
line end style, that extends beyond the edges of the graphics device,
the graphics engine clips the line to the edge of the device and the
thick square end of the clipped line is visible in the output (like the
left end of the line below).
Furthermore, the defence against large values may no longer be necessary
for important modern graphics devices, formats, and viewers.
The implementation of clipping in the graphics engine has been modified
in several ways to improve the situation, the most important being:
* Graphics devices can now specify `deviceClip = TRUE` to indicate
that the graphics engine should perform no clipping at all for that
device.
* When the graphics engine clips output for a device that can clip
itself (`canClip = TRUE`), the output is clipped to a region much larger
than the device, rather than to the edges of the device. This removes
artifacts like the thick square end of the clipped line above; the
new, corrected result is shown below.
Several other minor improvements have also been made; see
here for more details.
The main impact of these changes should be improved output thanks to the
removal of graphics engine clipping artifacts.
**Maintainers of R packages that provide graphics devices may wish to
experiment with the new `deviceClip` setting in case that provides
a performance improvement (by removing graphics engine clipping
calculations).**
**Maintainers of R packages that perform
visual difference testing (e.g., using the 'vdiffr' or 'gdiff' packages)
may need to update their "model" output files to adjust for the removal of
clipping artifacts.**