text: 'use strict';
  
  const color = require('color');
  const is = require('./is');
  
  /**
   * Colourspaces.
   * @private
   */
  const colourspace = {
    multiband: 'multiband',
    'b-w': 'b-w',
    bw: 'b-w',
    cmyk: 'cmyk',
    srgb: 'srgb'
  };
  
  /**
   * Tint the image using the provided chroma while preserving the image luminance.
   * An alpha channel may be present and will be unchanged by the operation.
   *
   * @param {string|Object} rgb - parsed by the [color](https://www.npmjs.org/package/color) module to extract chroma values.
   * @returns {Sharp}
   * @throws {Error} Invalid parameter
   */
  function tint (rgb) {
    const colour = color(rgb);
    this.options.tintA = colour.a();
    this.options.tintB = colour.b();
    return this;
  }
  
  /**
   * Convert to 8-bit greyscale; 256 shades of grey.
   * This is a linear operation. If the input image is in a non-linear colour space such as sRGB, use `gamma()` with `greyscale()` for the best results.
   * By default the output image will be web-friendly sRGB and contain three (identical) color channels.
   * This may be overridden by other sharp operations such as `toColourspace('b-w')`,
   * which will produce an output image containing one color channel.
   * An alpha channel may be present, and will be unchanged by the operation.
   * @param {Boolean} [greyscale=true]
   * @returns {Sharp}
   */
  function greyscale (greyscale) {
    this.options.greyscale = is.bool(greyscale) ? greyscale : true;
    return this;
  }
  
  /**
   * Alternative spelling of `greyscale`.
   * @param {Boolean} [grayscale=true]
   * @returns {Sharp}
   */
  function grayscale (grayscale) {
    return this.greyscale(grayscale);
  }
  
  /**
   * Set the output colourspace.
   * By default output image will be web-friendly sRGB, with additional channels interpreted as alpha channels.
   *
   * @example
   * // Output 16 bits per pixel RGB
   * await sharp(input)
   *  .toColourspace('rgb16')
   *  .toFile('16-bpp.png')
   *
   * @param {string} [colourspace] - output colourspace e.g. `srgb`, `rgb`, `cmyk`, `lab`, `b-w` [...](https://github.com/libvips/libvips/blob/master/libvips/iofuncs/enumtypes.c#L568)
   * @returns {Sharp}
   * @throws {Error} Invalid parameters
   */
  function toColourspace (colourspace) {
    if (!is.string(colourspace)) {
      throw is.invalidParameterError('colourspace', 'string', colourspace);
    }
    this.options.colourspace = colourspace;
    return this;
  }
  
  /**
   * Alternative spelling of `toColourspace`.
   * @param {string} [colorspace] - output colorspace.
   * @returns {Sharp}
   * @throws {Error} Invalid parameters
   */
  function toColorspace (colorspace) {
    return this.toColourspace(colorspace);
  }
  
  /**
   * Update a colour attribute of the this.options Object.
   * @private
   * @param {string} key
   * @param {string|Object} value
   * @throws {Error} Invalid value
   */
  function _setBackgroundColourOption (key, value) {
    if (is.defined(value)) {
      if (is.object(value) || is.string(value)) {
        const colour = color(value);
        this.options[key] = [
          colour.red(),
          colour.green(),
          colour.blue(),
          Math.round(colour.alpha() * 255)
        ];
      } else {
        throw is.invalidParameterError('background', 'object or string', value);
      }
    }
  }
  
  /**
   * Decorate the Sharp prototype with colour-related functions.
   * @private
   */
  module.exports = function (Sharp) {
    Object.assign(Sharp.prototype, {
      // Public
      tint,
      greyscale,
      grayscale,
      toColourspace,
      toColorspace,
      // Private
      _setBackgroundColourOption
    });
    // Class attributes
    Sharp.colourspace = colourspace;
    Sharp.colorspace = colourspace;
  };
  