blob: 17691909062ec93983cb6471f4eaf3aa90e88652 [file] [log] [blame]
# File src/library/grDevices/R/unix/dev2bitmap.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2014 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
dev2bitmap <- function(file, type = "png16m", height = 7, width = 7, res = 72,
units = "in", pointsize, ...,
method = c("postscript", "pdf"), taa = NA, gaa = NA)
{
if(missing(file)) stop("'file' is missing with no default")
if(!is.character(file) || length(file) != 1L || !nzchar(file))
stop("'file' must be a non-empty character string")
method <- match.arg(method)
units <- match.arg(units, c("in", "px", "cm", "mm"))
height <- switch(units, "in"=1, "cm"=1/2.54, "mm"=1/25.4, "px"=1/res) * height
width <- switch(units, "in"=1, "cm"=1/2.54, "mm"=1/25.4, "px"=1/res) * width
gsexe <- tools::find_gs_cmd()
if(!nzchar(gsexe)) stop("GhostScript was not found")
check_gs_type(gsexe, type)
if(missing(pointsize)) pointsize <- 1.5*min(width, height)
tmp <- tempfile("Rbit")
on.exit(unlink(tmp))
din <- graphics::par("din"); w <- din[1L]; h <- din[2L]
if(missing(width) && !missing(height)) width <- w/h * height
if(missing(height) && !missing(width)) height <- h/w * width
current.device <- dev.cur()
if(method == "pdf")
dev.off(dev.copy(device = pdf, file = tmp, width = width,
height = height,
pointsize = pointsize, paper = "special", ...))
else
dev.off(dev.copy(device = postscript, file = tmp, width = width,
height = height,
pointsize = pointsize, paper = "special",
horizontal = FALSE, ...))
dev.set(current.device)
extra <- ""
if (!is.na(taa)) extra <- paste0(" -dTextAlphaBits=", taa)
if (!is.na(gaa)) extra <- paste0(extra, " -dGraphicsAlphaBits=", gaa)
cmd <- paste0(shQuote(gsexe), " -dNOPAUSE -dBATCH -q -sDEVICE=", type,
" -r", res,
" -dAutoRotatePages=/None",
" -g", ceiling(res*width), "x", ceiling(res*height),
extra,
" -sOutputFile=", shQuote(file), " ", tmp)
system(cmd)
invisible()
}
bitmap <- function(file, type = "png16m", height = 7, width = 7, res = 72,
units = "in", pointsize, taa = NA, gaa = NA, ...)
{
if(missing(file)) stop("'file' is missing with no default")
if(!is.character(file) || length(file) != 1L || !nzchar(file))
stop("'file' must be a non-empty character string")
units <- match.arg(units, c("in", "px", "cm", "mm"))
height <- switch(units, "in"=1, "cm"=1/2.54, "mm"=1/25.4, "px"=1/res) * height
width <- switch(units, "in"=1, "cm"=1/2.54, "mm"=1/25.4, "px"=1/res) * width
gsexe <- tools::find_gs_cmd()
if(!nzchar(gsexe)) stop("GhostScript was not found")
check_gs_type(gsexe, type)
if(missing(pointsize)) pointsize <- 1.5*min(width, height)
extra <- ""
if (!is.na(taa)) extra <- paste0(" -dTextAlphaBits=", taa)
if (!is.na(gaa)) extra <- paste0(extra, " -dGraphicsAlphaBits=", gaa)
cmd <- paste0("|", shQuote(gsexe),
" -dNOPAUSE -dBATCH -q -sDEVICE=", type,
" -r", res,
" -dAutoRotatePages=/None",
" -g", ceiling(res*width), "x", ceiling(res*height),
extra,
" -sOutputFile=", shQuote(file), " -")
postscript(file = cmd, width = width, height = height,
pointsize = pointsize, paper = "special", horizontal = FALSE, ...)
invisible()
}
## unexported
check_gs_type <- function(gsexe, type)
{
gshelp <- system(paste(gsexe, "-help"), intern = TRUE)
st <- grep("^Available", gshelp)
en <- grep("^Search", gshelp)
if(!length(st) || !length(en))
warning("unrecognized format of gs -help")
else {
gsdevs <- gshelp[(st+1L):(en-1L)]
devs <- c(strsplit(gsdevs, " "), recursive = TRUE)
if(match(type, devs, 0L) == 0L) {
op <- options(warning.length = 8000L)
on.exit(options(op))
stop(gettextf("device '%s' is not available\n", type),
gettextf("Available devices are:\n%s",
paste(gsdevs, collapse = "\n")),
domain = NA)
}
}
}