'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. * @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; };