% File src/library/grDevices/man/dev2.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2013 R Core Team
% Distributed under GPL 2 or later

\name{dev2}
\alias{dev.copy}
\alias{dev.print}
\alias{dev.copy2eps}
\alias{dev.copy2pdf}
\alias{dev.control}
\title{Copy Graphics Between Multiple Devices}
\usage{
dev.copy(device, \dots, which = dev.next())
dev.print(device = postscript, \dots)
dev.copy2eps(\dots)
dev.copy2pdf(\dots, out.type = "pdf")
dev.control(displaylist = c("inhibit", "enable"))
}
\arguments{
  \item{device}{A device function (e.g., \code{x11},
    \code{postscript}, \ldots)}
  \item{\dots}{Arguments to the \code{device} function above: for
    \code{dev.copy2eps} arguments to \code{\link{postscript}} and for
    \code{dev.copy2pdf}, arguments to \code{\link{pdf}}.
    For \code{dev.print}, this includes \code{which} and by default any
    \code{\link{postscript}} arguments.}
  \item{which}{A device number specifying the device to copy to.}
  \item{out.type}{The name of the output device: can be \code{"pdf"}, or
    \code{"quartz"} (some macOS builds) or \code{"cairo"} (Windows
    and some Unix-alikes, see \code{\link{cairo_pdf}}).}
  \item{displaylist}{A character string: the only valid values are
    \code{"inhibit"} and \code{"enable"}.}
}
\description{
  \code{dev.copy} copies the graphics contents of the current device
  to the device specified by \code{which} or to a new device which has
  been created by the function specified by \code{device} (it is an
  error to specify both \code{which} and \code{device}).  (If recording
  is off on the current device, there are no contents to copy: this will
  result in no plot or an empty plot.)
  The device copied to becomes the current device.

  \code{dev.print} copies the graphics contents of the current device
  to a new device which has been created by the function specified by
  \code{device} and then shuts the new device.

  \code{dev.copy2eps} is similar to \code{dev.print} but produces an
  \abbr{EPSF} output file in portrait orientation (\code{horizontal = FALSE}).
  \code{dev.copy2pdf} is the analogue for PDF output.

  \code{dev.control} allows the user to control the recording of
  graphics operations in a device.  If \code{displaylist} is \code{"inhibit"}
  (\code{"enable"}) then recording is turned off (on). It is only safe
  to change this at the beginning of a plot (just before or just after a
  new page).  Initially recording is on for screen devices, and off for
  print devices.
}
\value{
  \code{dev.copy} returns the name and number of the device which has
  been copied to.

  \code{dev.print}, \code{dev.copy2eps} and \code{dev.copy2pdf} return
  the name and number of the device which has been copied from.
}
\details{
  Note that these functions copy the \emph{device region} and not a
  plot: the background colour of the device surface is part of what is
  copied.  Most screen devices default to a transparent background, which
  is probably not what is needed when copying to a device such as
  \code{\link{png}}.

  For \code{dev.copy2eps} and \code{dev.copy2pdf}, \code{width} and
  \code{height} are taken from the current device unless otherwise
  specified.  If just one of \code{width} and \code{height} is
  specified, the other is adjusted to preserve the aspect ratio of the
  device being copied.  The default file name is \code{Rplot.eps} or
  \code{Rplot.pdf}, and can be overridden by specifying a \code{file}
  argument.

  Copying to devices such as \code{\link{pdf}} and
  \code{\link{postscript}} which need font families pre-specified needs
  extra care -- \R is unaware of which families were used in a plot and
  so they will need to manually specified by the \code{fonts} argument
  passed as part of \code{\dots}.  Similarly, if the device to be copied
  from was opened with a \code{family} argument, a suitable
  \code{family} argument will need to be included in \code{\dots}.

  The default for \code{dev.print} is to produce and print a postscript
  copy.  This will not work unless \code{\link{options}("printcmd")} is
  set suitably and you have a PostScript printing system: see
  \code{\link{postscript}} for how to set this up.  Windows users may
  prefer to use \code{dev.print(win.print)}.

  \code{dev.print} is most useful for producing a postscript print
  (its default) when the following applies.  Unless
  \code{file} is specified, the plot will be printed.  Unless
  \code{width}, \code{height} and \code{pointsize} are specified
  the plot dimensions will be taken from the current device, shrunk
  if necessary to fit on the paper. (\code{pointsize} is rescaled if the
  plot is shrunk.)  If \code{horizontal} is not specified and the plot
  can be printed at full size by switching its value this is done
  instead of shrinking the plot region.

  If \code{dev.print} is used with a specified \code{device} (even
  \code{postscript}) it sets the width and height in the same way as
  \code{dev.copy2eps}.  This will not be appropriate unless the device
  specifies dimensions in inches, in particular not for
  \code{png}, \code{jpeg}, \code{tiff} and \code{bmp} unless
  \code{units = "inches"} is specified.
}
\note{
  Most devices (including all screen devices) have a display list
  which records all of the graphics operations that occur in the device.
  \code{dev.copy} copies graphics contents by copying the display list
  from one device to another device.  Also, automatic redrawing of
  graphics contents following the resizing of a device depends on the
  contents of the display list.

  After the command \code{dev.control("inhibit")}, graphics operations
  are not recorded in the display list so that \code{dev.copy} and
  \code{dev.print} will not copy anything and the contents of a device
  will not be redrawn automatically if the device is resized.

  The recording of graphics operations is relatively expensive in
  terms of memory so the command \code{dev.control("inhibit")} can be
  useful if memory usage is an issue.
}
\seealso{
  \code{\link{dev.cur}} and other \code{dev.xxx} functions.
}
\examples{
\dontrun{
x11() # on a Unix-alike
plot(rnorm(10), main = "Plot 1")
dev.copy(device = x11)
mtext("Copy 1", 3)
dev.print(width = 6, height = 6, horizontal = FALSE) # prints it
dev.off(dev.prev())
dev.off()
}
}
\keyword{device}
