// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause /** * @class vtkNamedColors * @brief A class holding colors and their names. * * For a web page showcasing VTK Named Colors and their RGB values, see: * VTKNamedColorPatches; * NamedColorPatches * was used to generate this table. * * Color names are case insensitive and are stored as lower-case names * along with a 4-element array whose elements are red, green, blue and alpha, * in that order, corresponding to the RGBA value of the color. * * It is assumed that if the RGBA values are unsigned char then each element * lies in the range 0...255 and if the RGBA values are double then each * element lies in the range 0...1. * * The colors and names are those in Web * colors that are derived from the CSS3 specification: CSS Color Module Level 3 In this table * common synonyms such as cyan/aqua and magenta/fuchsia are also included. * * Also included in this class are names and colors taken from * Wrapping/Python/vtkmodules/util/colors.py that were originally taken from * Wrapping/Tcl/vtktesting/colors.tcl (no longer in the VTK source files - deleted * 06-Dec-2017). * * Web colors and names in Web colors take * precedence over those in colors.py. One consequence of this * is that while colors.py specifies green as equivalent to * (0,255,0), the web color standard defines it as (0,128,0). * * The \a SetColor methods will overwrite existing colors if the name of the * color being set matches an existing color. Note that ColorExists() can be * used to test for existence of the color being set. * * In the case of the \a GetColor methods returning doubles, alternative versions, * identified by the letters RGB in the names, are provided. * These get functions return just the red, green and blue components of * a color. * * The class also provides methods for defining a color through an HTML color * string. The following formats are supported: * * - \#RGB (3-digit hexadecimal number, where #4F2 is a shortcut for #44FF22) * - \#RRGGBB (6-digit hexadecimal number) * - rgb(r, g, b) (where r, g, b are in 0..255 or percentage values) * - rgba(r, g, b, a) (where r, g, b, are in 0..255 or percentage values, a is in 0.0..1.0) * - a CSS3 color name (e.g. "steelblue") */ #ifndef vtkNamedColors_h #define vtkNamedColors_h #include "vtkColor.h" // Needed for vtkColor[34]ub #include "vtkCommonColorModule.h" // For export macro #include "vtkObject.h" #include "vtkStdString.h" // Needed for arguments #include "vtkStringArray.h" // For returning color names #include "vtkWrappingHints.h" // For VTK_MARSHALAUTO VTK_ABI_NAMESPACE_BEGIN class vtkNamedColorsDataStore; class vtkColorStringParser; class VTKCOMMONCOLOR_EXPORT VTK_MARSHALAUTO vtkNamedColors : public vtkObject { public: vtkTypeMacro(vtkNamedColors, vtkObject); /** * Methods invoked by print to print information about the object * including superclasses. Typically not called by the user * (use Print() instead) but used in the hierarchical print * process to combine the output of several classes. */ void PrintSelf(ostream& os, vtkIndent indent) override; /** * Create a new vtkNamedColors object. */ static vtkNamedColors* New(); /** * Get the number of colors. */ int GetNumberOfColors(); /** * Reset the colors in the color map to the original colors. * Any colors inserted by the user will be lost. */ void ResetColors(); /** * Return true if the color exists. */ bool ColorExists(const vtkStdString& name); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a vtkColor4ub class. * The color black is returned if the color is not found. */ vtkColor4ub GetColor4ub(const vtkStdString& name); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as four unsigned char variables: * red, green, blue, alpha. The range of each element is 0...255. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, unsigned char& r, unsigned char& g, unsigned char& b, unsigned char& a); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as an unsigned char array: * [red, green, blue, alpha]. The range of each element is 0...255. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, unsigned char rgba[4]); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a vtkColor4ub class. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, vtkColor4ub& rgba); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a vtkColor4d class. * The color black is returned if the color is not found. */ vtkColor4d GetColor4d(const vtkStdString& name); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as four double variables: * red, green, blue, alpha. The range of each element is 0...1. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, double& r, double& g, double& b, double& a); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a double array: * [red, green, blue, alpha]. The range of each element is 0...1. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, double rgba[4]); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a vtkColor4d class. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, vtkColor4d& rgba); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a vtkColor3ub class. * The color black is returned if the color is not found. */ vtkColor3ub GetColor3ub(const vtkStdString& name); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a vtkColor3d class. * The color black is returned if the color is not found. */ vtkColor3d GetColor3d(const vtkStdString& name); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as three double variables: * red, green, blue. The range of each element is 0...1. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, double& r, double& g, double& b); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a double array: * [red, green, blue]. The range of each element is 0...1. * The color black is returned if the color is not found. */ void GetColorRGB(const vtkStdString& name, double rgb[3]); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a vtkColor3ub class. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, vtkColor3ub& rgb); /** * Get the color by name. * The name is treated as being case-insensitive. * The color is returned as a vtkColor3d class. * The color black is returned if the color is not found. */ void GetColor(const vtkStdString& name, vtkColor3d& rgb); /** * Set the color by name. * The name is treated as being case-insensitive. * The range of each color is 0...255. * No color is set if the name is empty. */ virtual void SetColor(const vtkStdString& name, const unsigned char& r, const unsigned char& g, const unsigned char& b, const unsigned char& a = 255); /** * Set the color by name. * The name is treated as being case-insensitive. * The range of each color is 0...1. * No color is set if the name is empty. */ virtual void SetColor(const vtkStdString& name, const double& r, const double& g, const double& b, const double& a = 1); /** * Set the color by name. * The name is treated as being case-insensitive. * The color is an unsigned char array: * [red, green, blue, alpha]. The range of each element is 0...255. * The user must ensure that the color array size is 4. * No color is set if the name is empty. */ virtual void SetColor(const vtkStdString& name, const unsigned char rgba[4]); /** * Set the color by name. * The name is treated as being case-insensitive. * The color is a vtkColor4ub class. * No color is set if the name is empty. */ virtual void SetColor(const vtkStdString& name, const vtkColor4ub& rgba); /** * Set the color by name. * The name is treated as being case-insensitive. * The color is a vtkColor3ub class. * No color is set if the name is empty. */ virtual void SetColor(const vtkStdString& name, const vtkColor3ub& rgb); /** * Set the color by name. * The name is treated as being case-insensitive. * The color is a double array: * [red, green, blue, alpha]. The range of each element is 0...1. * No color is set if the name is empty. */ virtual void SetColor(const vtkStdString& name, const double rgba[4]); /** * Set the color by name. * The name is treated as being case-insensitive. * The color is a vtkColor4d class. * No color is set if the name is empty. */ virtual void SetColor(const vtkStdString& name, const vtkColor4d& rgba); /** * Set the color by name. * The name is treated as being case-insensitive. * The color is a vtkColor3d class. * No color is set if the name is empty. */ virtual void SetColor(const vtkStdString& name, const vtkColor3d& rgb); /** * Remove the color by name. * The name is treated as being case-insensitive. * Examples for parsing are provided in: * TestNamedColors.cxx and TestNamedColorsIntegration.py */ void RemoveColor(const vtkStdString& name); /** * Return a string of color names with each name * delimited by a line feed. * This is easily parsed by the user into whatever * data structure they require. * Examples for parsing are provided in: * TestNamedColors.cxx and TestNamedColorsIntegration.py */ vtkStdString GetColorNames(); /** * Return a string array of color names. */ void GetColorNames(vtkStringArray* colorNames); /** * Return a string of synonyms such as * cyan/aqua and magenta/fuchsia. * The string is formatted such that a single line feed delimits * each color in the synonym and a double line feed delimits each * synonym. * Warning this could take a long time for very large color maps. * This is easily parsed by the user into whatever * data structure they require. */ vtkStdString GetSynonyms(); /** * Return a vtkColor4ub instance from an HTML color string in any of * the following formats: * - \#RGB * - \#RRGGBB * - rgb(r, g, b) * - rgba(r, g, b, a) * - a CSS3 color name, e.g. "steelblue" * If the string argument defines a color using one of the above formats * the method returns the successfully parsed color else returns a color * equal to `rgba(0, 0, 0, 0)`. */ vtkColor4ub HTMLColorToRGBA(const vtkStdString& colorString); /** * Return a vtkColor3ub instance from an HTML color string in any of * the following formats: * - \#RGB * - \#RRGGBB * - rgb(r, g, b) * - rgba(r, g, b, a) * - a CSS3 color name, e.g. "steelblue" * If the string argument defines a color using one of the above formats * the method returns the successfully parsed color else returns the color * black. */ vtkColor3ub HTMLColorToRGB(const vtkStdString& colorString); /** * Given a vtkColor3ub instance as input color return a valid HTML color * string in the `#RRGGBB` format. */ vtkStdString RGBToHTMLColor(const vtkColor3ub& rgb); /** * Given a vtkColor4ub instance as input color return a valid HTML color * string in the `rgba(r, g, b, a)` format. */ vtkStdString RGBAToHTMLColor(const vtkColor4ub& rgba); /** * Set the color by name. * The name is treated as being case-insensitive. * The color must be a valid HTML color string. * No color is set if the name is empty or if `htmlString` is not a valid * HTML color string. */ void SetColor(const vtkStdString& name, const vtkStdString& htmlString); protected: vtkNamedColors(); ~vtkNamedColors() override; private: ///@{ /** * The implementation of the color map and other required methods. */ vtkNamedColorsDataStore* Colors; vtkColorStringParser* Parser; ///@} vtkNamedColors(const vtkNamedColors&) = delete; void operator=(const vtkNamedColors&) = delete; }; VTK_ABI_NAMESPACE_END #endif /* vtkNamedColors_h */