-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
54 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,64 +1,64 @@ | ||
#' Convert between colour spaces | ||
#' | ||
#' This function lets you convert between different representations of colours. | ||
#' | ||
#' This function lets you convert between different representations of colours. | ||
#' The API is reminiscent of [grDevices::convertColor()], but the performance is | ||
#' much better. It is not assured that `grDevices::convertColor()` and | ||
#' much better. It is not assured that `grDevices::convertColor()` and | ||
#' `convert_colour()` provide numerically equivalent conversion at 16bit level as | ||
#' the formula used are potentially slightly different. For all intend and | ||
#' the formula used are potentially slightly different. For all intend and | ||
#' purpose, the resulting colours will be equivalent though. | ||
#' | ||
#' | ||
#' @section Handling of non-finite and out of bounds values: | ||
#' `NA`, `NaN`, `-Inf`, and `Inf` are treated as invalid input and will result | ||
#' in `NA` values for the colour. If a given colourspace has finite bounds in | ||
#' `NA`, `NaN`, `-Inf`, and `Inf` are treated as invalid input and will result | ||
#' in `NA` values for the colour. If a given colourspace has finite bounds in | ||
#' some of their channels, the input will be capped before conversion, and the | ||
#' output will be capped before returning, so that both input and output colours | ||
#' are valid colours in their respective space. This means that converting back | ||
#' and forth between two colourspaces may result in a change in the colour if | ||
#' the gamut of one of the spaces is less than the other. | ||
#' | ||
#' @param colour A numeric matrix (or an object coercible to one) with colours | ||
#' encoded in the rows and the different colour space values in the columns. For | ||
#' all colourspaces except `'cmyk'` this will mean a matrix with three columns - | ||
#' | ||
#' @param colour A numeric matrix (or an object coercible to one) with colours | ||
#' encoded in the rows and the different colour space values in the columns. For | ||
#' all colourspaces except `'cmyk'` this will mean a matrix with three columns - | ||
#' for `'cmyk'` it means four columns. | ||
#' | ||
#' @param from,to The input and output colour space. Allowed values are: `"cmy"`, | ||
#' `"cmyk"`, `"hsl"`, `"hsb"`, `"hsv"`, `"lab"` (CIE L*ab), `"hunterlab"` | ||
#' (Hunter Lab), `"oklab"`, `"lch"` (CIE Lch(ab) / polarLAB), `"luv"`, | ||
#' | ||
#' @param from,to The input and output colour space. Allowed values are: `"cmy"`, | ||
#' `"cmyk"`, `"hsl"`, `"hsb"`, `"hsv"`, `"lab"` (CIE L*ab), `"hunterlab"` | ||
#' (Hunter Lab), `"oklab"`, `"lch"` (CIE Lch(ab) / polarLAB), `"luv"`, | ||
#' `"rgb"` (sRGB), `"xyz"`, `"yxy"` (CIE xyY), `"hcl"` (CIE Lch(uv) / polarLuv), | ||
#' or `"oklch"` (Polar form of oklab) | ||
#' | ||
#' @param white_from,white_to The white reference of the from and to colour | ||
#' space. Will only have an effect for relative colour spaces such as Lab and | ||
#' | ||
#' @param white_from,white_to The white reference of the from and to colour | ||
#' space. Will only have an effect for relative colour spaces such as Lab and | ||
#' luv. Any value accepted by [as_white_ref()] allowed. | ||
#' | ||
#' @return A numeric matrix with the same number of rows as `colour` and either | ||
#' 3 or 4 columns depending on the value of `to`. If `colour` is given as a | ||
#' | ||
#' @return A numeric matrix with the same number of rows as `colour` and either | ||
#' 3 or 4 columns depending on the value of `to`. If `colour` is given as a | ||
#' `data.frame` the output will be a data.frame as well | ||
#' | ||
#' | ||
#' @note This function and [convertColor()] are not | ||
#' numerically equivalent due to rounding errors, but for all intend and purpose | ||
#' they give the same results. | ||
#' | ||
#' | ||
#' @seealso [grDevices::convertColor()], [grDevices::col2rgb()] | ||
#' | ||
#' | ||
#' @export | ||
#' | ||
#' | ||
#' @examples | ||
#' spectrum <- decode_colour(rainbow(10)) | ||
#' spec_lab <- convert_colour(spectrum, 'rgb', 'lab') | ||
#' spec_lab | ||
#' | ||
#' | ||
#' # Convert between different white references | ||
#' convert_colour(spec_lab, 'lab', 'lab', white_from = 'D65', white_to = 'F10') | ||
#' | ||
#' | ||
convert_colour <- function(colour, from, to, white_from = 'D65', white_to = white_from) { | ||
res <- convert_c(colour, colourspace_match(from), colourspace_match(to), as_white_ref(white_from), as_white_ref(white_to)) | ||
colnames(res) <- colour_dims[[to]] | ||
colnames(res) <- colour_dims[[tolower(to)]] | ||
if (is.data.frame(colour)) res <- as.data.frame(res) | ||
res | ||
} | ||
|
||
convert_c <- function(colour, from, to, white_from, white_to) { | ||
.Call(`farver_convert_c`, as.matrix(colour), as.integer(from), as.integer(to), | ||
.Call(`farver_convert_c`, as.matrix(colour), as.integer(from), as.integer(to), | ||
as.numeric(white_from), as.numeric(white_to)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters